#pragma once #include #include #include #include #include #include #include #include "def.h" #include "memory/alloc.h" #include "memory/wrapper.h" #include "platform/detail.h" namespace ipc { namespace mem { template using static_sync_fixed = static_wrapper>>; namespace detail { struct chunk_mapping_policy { enum : std::size_t { base_size = sizeof(void*) * 1024 * 1024, /* 8MB(x64) */ classes_size = 1 }; constexpr static std::size_t classify(std::size_t size) { return (size <= base_size) ? 0 : static_cast(classes_size); } }; template struct chunk_alloc_recoverer { public: using alloc_policy = AllocP; constexpr static void swap(chunk_alloc_recoverer &) {} constexpr static void clear() {} constexpr static void try_recover(alloc_policy &) {} constexpr static void collect(alloc_policy &&) {} }; } // namespace detail using static_chunk_alloc = variable_wrapper; using chunk_variable_alloc = variable_alloc; template using static_async_fixed = static_wrapper/*, detail::chunk_alloc_recoverer*/>>; using async_pool_alloc = variable_wrapper; //using async_pool_alloc = static_wrapper>; 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 using unordered_map = std::unordered_map< Key, T, std::hash, std::equal_to, 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 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 {}; } } // namespace ipc