// file : bpkg/types.hxx -*- C++ -*- // license : MIT; see accompanying LICENSE file #ifndef BPKG_TYPES_HXX #define BPKG_TYPES_HXX #include #include #include // unique_ptr, shared_ptr #include // pair #include // size_t, nullptr_t #include // uint{8,16,32,64}_t #include #include #include // function, reference_wrapper #include // ios_base::failure #include // exception #include // logic_error, invalid_argument, runtime_error #include #include #include #include #include #include #include #include #include #include // icase_compare_string, // compare_reference_target #include #include #include #include #include namespace bpkg { // Commonly-used types. // using std::uint8_t; using std::uint16_t; using std::uint32_t; using std::uint64_t; using std::size_t; using std::nullptr_t; using std::pair; using std::string; using std::function; using std::reference_wrapper; using std::unique_ptr; using std::shared_ptr; using std::weak_ptr; using std::vector; using butl::small_vector; // using strings = vector; using cstrings = vector; using std::istream; using std::ostream; // Exceptions. While is included, there is no using for // std::exception -- use qualified. // using std::logic_error; using std::invalid_argument; using std::runtime_error; using std::system_error; using io_error = std::ios_base::failure; // // using butl::icase_compare_string; using butl::compare_reference_target; // // using butl::optional; using butl::nullopt; // // 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 = vector; using dir_paths = vector; // // using butl::uuid; // // using butl::url; // // using butl::sha256; using butl::sha256_to_fingerprint; using butl::fingerprint_to_sha256; // // using butl::process; using butl::process_env; using butl::process_path; using butl::process_exit; using butl::process_error; // // using butl::auto_fd; using butl::nullfd; using butl::fdpipe; using butl::ifdstream; using butl::ofdstream; using butl::fdstream_mode; // // using butl::target_triplet; // // using butl::default_options_files; using butl::default_options_entry; using butl::default_options; // // 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 lazy_shared_ptr: public odb::lazy_shared_ptr { public: using base_type = odb::lazy_shared_ptr; 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 lazy_weak_ptr: public odb::lazy_weak_ptr { public: using base_type = odb::lazy_weak_ptr; using base_type::base_type; bpkg::database& database () const; lazy_shared_ptr lock () const { return lazy_shared_ptr (base_type::lock ()); } }; struct compare_lazy_ptr { template 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 (x).database (), static_cast (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 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 // butl::. The latter is bad idea since libbutl includes the default // implementation. // namespace std { // Custom path printing (canonicalized, with trailing slash for directories). // inline ostream& operator<< (ostream& os, const ::butl::path& p) { string r (p.representation ()); ::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