// file : build2/types.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2017 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #ifndef BUILD2_TYPES_HXX #define BUILD2_TYPES_HXX #include #include #include #include #include // unique_ptr, shared_ptr #include // pair, move() #include // size_t, nullptr_t #include // uint{8,16,32,64}_t, *_MIN, *_MAX #include #include #include // hash, function, reference_wrapper #include #include #include #include #include #include #if defined(__cpp_lib_shared_mutex) || defined(__cpp_lib_shared_timed_mutex) # include #endif #include // ios_base::failure #include // exception #include // logic_error, invalid_argument, runtime_error #include #include #include #include #include #include #include #include #include #include #include #include namespace build2 { // 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::tuple; using std::string; using std::function; using std::reference_wrapper; using std::hash; using std::initializer_list; using std::unique_ptr; using std::shared_ptr; using std::weak_ptr; using std::array; using std::vector; using butl::vector_view; // using butl::small_vector; // using strings = vector; using cstrings = vector; using std::istream; using std::ostream; // Concurrency. // using std::atomic; using std::memory_order; using std::memory_order_relaxed; using std::memory_order_consume; using std::memory_order_acquire; using std::memory_order_release; using std::memory_order_acq_rel; using std::memory_order_seq_cst; using atomic_count = atomic; // Matches scheduler::atomic_count. using std::mutex; using mlock = std::unique_lock; using std::condition_variable; #if defined(__cpp_lib_shared_mutex) using shared_mutex = std::shared_mutex; using ulock = std::unique_lock; using slock = std::shared_lock; #elif defined(__cpp_lib_shared_timed_mutex) using shared_mutex = std::shared_timed_mutex; using ulock = std::unique_lock; using slock = std::shared_lock; #else // Because we have this fallback, we need to be careful not to create // multiple shared locks in the same thread. // struct shared_mutex: mutex { using mutex::mutex; void lock_shared () { lock (); } void try_lock_shared () { try_lock (); } void unlock_shared () { unlock (); } }; using ulock = std::unique_lock; using slock = ulock; #endif using std::defer_lock; using std::adopt_lock; using std::thread; namespace this_thread = std::this_thread; // 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::optional; using butl::nullopt; // // using butl::const_ptr; // // using butl::path; using butl::dir_path; using butl::basic_path; using butl::invalid_path; using butl::path_cast; // Absolute directory path. Note that for now we don't do any checking that // the path is in fact absolute. // // The idea is to have a different type that we automatically complete when // a (variable) value of this type gets initialized from untyped names. See // value_type for details. // // Note that currently we also normalize and actualize the path. And we // leave empty path as is. // struct abs_dir_path: dir_path { using dir_path::dir_path; explicit abs_dir_path (dir_path d): dir_path (std::move (d)) {} abs_dir_path () = default; }; using paths = std::vector; using dir_paths = std::vector; // // using butl::system_clock; using butl::timestamp; using butl::duration; using butl::timestamp_unknown; using butl::timestamp_unknown_rep; using butl::timestamp_nonexistent; using butl::operator<<; // // using butl::sha256; // // // using butl::process; using butl::process_path; using butl::process_error; using butl::auto_fd; using butl::ifdstream; using butl::ofdstream; // // using butl::target_triplet; // // using butl::standard_version; using butl::standard_version_constraint; // See context. // enum class run_phase {load, match, execute}; ostream& operator<< (ostream&, run_phase); // utility.cxx extern run_phase phase; } // In order to be found (via ADL) these have to be either in std:: or in // butl::. The latter is a bad idea since libbutl includes the default // implementation. They are defined in utility.cxx. // namespace std { // Path printing with trailing slash for directories. // ostream& operator<< (ostream&, const ::butl::path&); // Print as recall[@effect]. // ostream& operator<< (ostream&, const ::butl::process_path&); } // // #include #endif // BUILD2_TYPES_HXX