|
Boost : |
Subject: [boost] interprocess with unordered_map
From: Joel Young (jdy_at_[hidden])
Date: 2012-03-14 22:14:16
>>
Folks,
I've built a unordered_map in a memory mapped file. The map goes from:
typedef boost::interprocess::allocator<
char,
boost::interprocess::managed_mapped_file::segment_manager
> char_allocator_t;
typedef boost::interprocess::basic_string<
char,
std::char_traits<char>,
char_allocator_t
>
typedef std::pair< key_type, pay_type> val_type;
typedef boost::interprocess::allocator<
val_type,
boost::interprocess::managed_mapped_file::segment_manager> allocator_t;
typedef boost::unordered_map<
key_type,
pay_type,
boost::hash<key_type>,
std::equal_to<key_type>,
allocator_t> map_type;
Everything works fine on creation. But when I later go to read from the map in
a different program where the mapped file is opened read only, I have to do
gymcrackery like:
// A temporary string that allocates from the mapped file
struct shm_clean { // cleanup shared memory on stack-unwind
shm_clean() {
boost::interprocess::shared_memory_object::remove("StupidSharedMemory");
}
~shm_clean() {
boost::interprocess::shared_memory_object::remove("StupidSharedMemory");
}
} cleaner;
boost::interprocess::managed_shared_memory
stupid(boost::interprocess::create_only ,"StupidSharedMemory" ,500);
key_type key_val(stupid.get_segment_manager());
to create a temporary to allow me to search since the maps find() method will
only take a key_type and interprocess::basic_string WILL NOT implicitly
construct from a std::string, nor will it implicitly construct from a char* to
itself.
Can the interprocess::basic_string be modified to allow these conversions?
I hate having to do:
key_val = "fruitcake";
db.find(key_val);
Suggestions?
Thanks!
Joel
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk