#pragma once #include #include #include #include #include #include #include #include #include "libipc/def.h" #include "libipc/memory/alloc.h" #include "libipc/memory/wrapper.h" #include "libipc/platform/detail.h" namespace ipc { namespace mem { //using async_pool_alloc = static_wrapper, // fixed_expand_policy // >, // default_recycler >>>; using async_pool_alloc = ipc::mem::static_alloc; template using allocator = allocator_wrapper; } // namespace mem namespace { constexpr char const * pf(int) { return "%d" ; } constexpr char const * pf(long) { return "%ld" ; } constexpr char const * pf(long long) { return "%lld"; } constexpr char const * pf(unsigned int) { return "%u" ; } constexpr char const * pf(unsigned long) { return "%lu" ; } constexpr char const * pf(unsigned long long) { return "%llu"; } constexpr char const * pf(float) { return "%f" ; } constexpr char const * pf(double) { return "%f" ; } constexpr char const * pf(long double) { return "%Lf" ; } } // internal-linkage template struct hash : public std::hash {}; template using unordered_map = std::unordered_map< Key, T, ipc::hash, std::equal_to, ipc::mem::allocator> >; template using map = std::map< Key, T, std::less, ipc::mem::allocator> >; template using basic_string = std::basic_string< Char, std::char_traits, ipc::mem::allocator >; using string = basic_string; using wstring = basic_string; template <> struct hash { std::size_t operator()(string const &val) const noexcept { return std::hash{}(val.c_str()); } }; template <> struct hash { std::size_t operator()(wstring const &val) const noexcept { return std::hash{}(val.c_str()); } }; template ipc::string to_string(T val) { char buf[std::numeric_limits::digits10 + 1] {}; if (std::snprintf(buf, sizeof(buf), pf(val), val) > 0) { return buf; } return {}; } /// \brief Check string validity. constexpr bool is_valid_string(char const *str) noexcept { return (str != nullptr) && (str[0] != '\0'); } /// \brief Make a valid string. inline ipc::string make_string(char const *str) { return is_valid_string(str) ? ipc::string{str} : ipc::string{}; } /// \brief Combine prefix from a list of strings. inline ipc::string make_prefix(ipc::string prefix, std::initializer_list args) { prefix += "__IPC_SHM__"; for (auto const &txt: args) { if (txt.empty()) continue; prefix += txt; } return prefix; } } // namespace ipc