added boost::concurrent_flat_set to mmap_tests

This commit is contained in:
joaquintides
2023-09-16 11:18:39 +02:00
parent 44582ecbb9
commit cad3509a17
2 changed files with 30 additions and 6 deletions

View File

@ -260,6 +260,7 @@ local MMAP_CONTAINERS =
unordered_multimap unordered_multimap
unordered_multiset unordered_multiset
concurrent_flat_map concurrent_flat_map
concurrent_flat_set
; ;
for local container in $(MMAP_CONTAINERS) for local container in $(MMAP_CONTAINERS)

View File

@ -1,4 +1,5 @@
// Copyright 2023 Christian Mazakas. // Copyright 2023 Christian Mazakas.
// Copyright 2023 Joaquin M Lopez Munoz.
// Distributed under the Boost Software License, Version 1.0. (See accompanying // Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@ -21,6 +22,7 @@ int main() {}
#include <boost/unordered/unordered_set.hpp> #include <boost/unordered/unordered_set.hpp>
#include <boost/unordered/concurrent_flat_map.hpp> #include <boost/unordered/concurrent_flat_map.hpp>
#include <boost/unordered/concurrent_flat_set.hpp>
#include <boost/interprocess/allocators/allocator.hpp> #include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/containers/string.hpp> #include <boost/interprocess/containers/string.hpp>
@ -82,10 +84,25 @@ get_container_type()
using concurrent_map = decltype( using concurrent_map = decltype(
get_container_type<boost::concurrent_flat_map>()); get_container_type<boost::concurrent_flat_map>());
using concurrent_set = decltype(
get_container_type<boost::concurrent_flat_set>());
template <class C>
struct is_concurrent_container: std::false_type {};
template <typename... Args>
struct is_concurrent_container<boost::concurrent_flat_map<Args...> >:
std::true_type {};
template <typename... Args>
struct is_concurrent_container<boost::concurrent_flat_set<Args...> >:
std::true_type {};
static char const* shm_map_name = "shared_map"; static char const* shm_map_name = "shared_map";
template <class C> template <class C>
void parent(std::string const& shm_name_, char const* exe_name, C*) typename std::enable_if<!is_concurrent_container<C>::value, void>::type
parent(std::string const& shm_name_, char const* exe_name, C*)
{ {
struct shm_remove struct shm_remove
{ {
@ -151,7 +168,9 @@ void parent(std::string const& shm_name_, char const* exe_name, C*)
segment.destroy<container_type>(shm_map_name); segment.destroy<container_type>(shm_map_name);
} }
template <class C> void child(std::string const& shm_name, C*) template <class C>
typename std::enable_if<!is_concurrent_container<C>::value, void>::type
child(std::string const& shm_name, C*)
{ {
using container_type = C; using container_type = C;
using iterator = typename container_type::iterator; using iterator = typename container_type::iterator;
@ -184,7 +203,9 @@ template <class C> void child(std::string const& shm_name, C*)
} }
} }
void parent(std::string const& shm_name_, char const* exe_name, concurrent_map*) template <class C>
typename std::enable_if<is_concurrent_container<C>::value, void>::type
parent(std::string const& shm_name_, char const* exe_name, C*)
{ {
struct shm_remove struct shm_remove
{ {
@ -200,7 +221,7 @@ void parent(std::string const& shm_name_, char const* exe_name, concurrent_map*)
} }
} remover{shm_name_.c_str()}; } remover{shm_name_.c_str()};
using container_type = concurrent_map; using container_type = C;
std::size_t const shm_size = 64 * 1024; std::size_t const shm_size = 64 * 1024;
@ -239,9 +260,11 @@ void parent(std::string const& shm_name_, char const* exe_name, concurrent_map*)
segment.destroy<container_type>(shm_map_name); segment.destroy<container_type>(shm_map_name);
} }
void child(std::string const& shm_name, concurrent_map*) template <class C>
typename std::enable_if<is_concurrent_container<C>::value, void>::type
child(std::string const& shm_name, C*)
{ {
using container_type = concurrent_map; using container_type = C;
boost::interprocess::managed_shared_memory segment( boost::interprocess::managed_shared_memory segment(
boost::interprocess::open_only, shm_name.c_str()); boost::interprocess::open_only, shm_name.c_str());