diff options
Diffstat (limited to 'bpkg/types.hxx')
-rw-r--r-- | bpkg/types.hxx | 151 |
1 files changed, 128 insertions, 23 deletions
diff --git a/bpkg/types.hxx b/bpkg/types.hxx index 4f0cc98..80e5a7d 100644 --- a/bpkg/types.hxx +++ b/bpkg/types.hxx @@ -21,14 +21,20 @@ #include <odb/lazy-ptr.hxx> -#include <libbutl/url.mxx> -#include <libbutl/path.mxx> -#include <libbutl/process.mxx> -#include <libbutl/utility.mxx> // compare_reference_target -#include <libbutl/optional.mxx> -#include <libbutl/fdstream.mxx> -#include <libbutl/small-vector.mxx> -#include <libbutl/default-options.mxx> +#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.hxx> +#include <libbutl/fdstream.hxx> +#include <libbutl/small-vector.hxx> +#include <libbutl/target-triplet.hxx> +#include <libbutl/default-options.hxx> namespace bpkg { @@ -52,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*>; @@ -69,37 +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; @@ -107,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; @@ -116,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 @@ -138,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 |