aboutsummaryrefslogtreecommitdiff
path: root/bpkg/types.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'bpkg/types.hxx')
-rw-r--r--bpkg/types.hxx149
1 files changed, 126 insertions, 23 deletions
diff --git a/bpkg/types.hxx b/bpkg/types.hxx
index 65dba60..80e5a7d 100644
--- a/bpkg/types.hxx
+++ b/bpkg/types.hxx
@@ -21,15 +21,20 @@
#include <odb/lazy-ptr.hxx>
-#include <libbutl/url.mxx>
-#include <libbutl/path.mxx>
-#include <libbutl/process.mxx>
-#include <libbutl/utility.mxx> // icase_compare_string,
+#include <libbutl/b.hxx>
+#include <libbutl/url.hxx>
+#include <libbutl/path.hxx>
+#include <libbutl/uuid.hxx>
+#include <libbutl/uuid-io.hxx>
+#include <libbutl/sha256.hxx>
+#include <libbutl/process.hxx>
+#include <libbutl/utility.hxx> // icase_compare_string,
// compare_reference_target
-#include <libbutl/optional.mxx>
-#include <libbutl/fdstream.mxx>
-#include <libbutl/small-vector.mxx>
-#include <libbutl/default-options.mxx>
+#include <libbutl/optional.hxx>
+#include <libbutl/fdstream.hxx>
+#include <libbutl/small-vector.hxx>
+#include <libbutl/target-triplet.hxx>
+#include <libbutl/default-options.hxx>
namespace bpkg
{
@@ -53,7 +58,7 @@ namespace bpkg
using std::weak_ptr;
using std::vector;
- using butl::small_vector; // <libbutl/small-vector.mxx>
+ using butl::small_vector; // <libbutl/small-vector.hxx>
using strings = vector<string>;
using cstrings = vector<const char*>;
@@ -70,38 +75,45 @@ namespace bpkg
using std::system_error;
using io_error = std::ios_base::failure;
- // <libbutl/utility.mxx>
+ // <libbutl/utility.hxx>
//
using butl::icase_compare_string;
using butl::compare_reference_target;
- // <libbutl/optional.mxx>
+ // <libbutl/optional.hxx>
//
using butl::optional;
using butl::nullopt;
- // ODB smart pointers.
- //
- using odb::lazy_shared_ptr;
- using odb::lazy_weak_ptr;
-
- // <libbutl/path.mxx>
+ // <libbutl/path.hxx>
//
using butl::path;
+ using butl::path_name;
+ using butl::path_name_view;
using butl::dir_path;
using butl::basic_path;
using butl::invalid_path;
using butl::path_cast;
- using paths = std::vector<path>;
- using dir_paths = std::vector<dir_path>;
+ using paths = vector<path>;
+ using dir_paths = vector<dir_path>;
+
+ // <libbutl/uuid.hxx>
+ //
+ using butl::uuid;
- // <libbutl/url.mxx>
+ // <libbutl/url.hxx>
//
using butl::url;
- // <libbutl/process.mxx>
+ // <libbutl/sha256.hxx>
+ //
+ using butl::sha256;
+ using butl::sha256_to_fingerprint;
+ using butl::fingerprint_to_sha256;
+
+ // <libbutl/process.hxx>
//
using butl::process;
using butl::process_env;
@@ -109,7 +121,7 @@ namespace bpkg
using butl::process_exit;
using butl::process_error;
- // <libbutl/fdstream.mxx>
+ // <libbutl/fdstream.hxx>
//
using butl::auto_fd;
using butl::nullfd;
@@ -118,11 +130,94 @@ namespace bpkg
using butl::ofdstream;
using butl::fdstream_mode;
- // <libbutl/default-options.mxx>
+ // <libbutl/target-triplet.hxx>
+ //
+ using butl::target_triplet;
+
+ // <libbutl/default-options.hxx>
//
using butl::default_options_files;
using butl::default_options_entry;
using butl::default_options;
+
+ // <libbutl/b.hxx>
+ //
+ using package_info = butl::b_project_info;
+
+ // Derive from ODB smart pointers to return derived database (note that the
+ // database() functions are defined in database.hxx).
+ //
+ class database;
+
+ template <class T>
+ class lazy_shared_ptr: public odb::lazy_shared_ptr<T>
+ {
+ public:
+ using base_type = odb::lazy_shared_ptr<T>;
+
+ using base_type::base_type;
+
+ explicit
+ lazy_shared_ptr (base_type&& p): base_type (move (p)) {}
+
+ lazy_shared_ptr () = default;
+
+ bpkg::database&
+ database () const;
+ };
+
+ template <class T>
+ class lazy_weak_ptr: public odb::lazy_weak_ptr<T>
+ {
+ public:
+ using base_type = odb::lazy_weak_ptr<T>;
+
+ using base_type::base_type;
+
+ bpkg::database&
+ database () const;
+
+ lazy_shared_ptr<T>
+ lock () const
+ {
+ return lazy_shared_ptr<T> (base_type::lock ());
+ }
+ };
+
+ struct compare_lazy_ptr
+ {
+ template <typename P>
+ bool
+ operator() (const P& x, const P& y) const
+ {
+ // See operator==(database, database).
+ //
+ return x.object_id () != y.object_id ()
+ ? (x.object_id () < y.object_id ())
+ : less (static_cast<typename P::base_type> (x).database (),
+ static_cast<typename P::base_type> (y).database ());
+ }
+
+ private:
+ // Defined in database.cxx.
+ //
+ bool
+ less (const odb::database&, const odb::database&) const;
+ };
+
+ // Compare two lazy pointers via the pointed-to object ids.
+ //
+ struct compare_lazy_ptr_id
+ {
+ template <typename P>
+ bool
+ operator() (const P& x, const P& y) const
+ {
+ // Note: ignoring database is intentional.
+ //
+ return x.object_id () < y.object_id ();
+ }
+ };
}
// In order to be found (via ADL) these have to be either in std:: or in
@@ -140,6 +235,14 @@ namespace std
::butl::path::traits_type::canonicalize (r);
return os << r;
}
+
+ inline ostream&
+ operator<< (ostream& os, const ::butl::path_name_view& v)
+ {
+ assert (!v.empty ());
+
+ return v.name != nullptr && *v.name ? (os << **v.name) : (os << *v.path);
+ }
}
#endif // BPKG_TYPES_HXX