Сохраните карту STL в Boost ConstBufferSequence - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь сохранить std::map<enum, int> в boost::beast::multi_buffer.До сих пор я использовал boost::asio::buffer_copy и boost::asio::buffer для хранения векторов и POD.Однако я не смог найти способ сохранить карту STL.

Я пробовал это:

auto t_map = std::map<CODES, int>(); // CODES is an enum type

auto t_map_size = t_map.size() * sizeof(std::pair<CODES, int>);
auto tmp_buffer = boost::asio::buffer(t_map, t_map_size); // this is not supported

auto size = boost::asio::buffer_copy(t_map_size , tmp_buffer);

boost::beast::multi_buffer buffer;
buffer.commit(size);
  1. Есть ли способ сохранить std::map<enum, int> вConstBufferSequence?(потому что boost::asio::buffer_copy нужен один)
  2. Если нет, то есть ли способ сохранить std::map<enum, int> в boost::beast::multi_buffer?

Спасибо!

1 Ответ

0 голосов
/ 15 февраля 2019

Вы можете преобразовать вашу карту в вектор POD, так как POD выбирает тип, который может хранить enum + int, например, int64_t:

Итак, создайте вектор, сканируйте свою карту, создавая элементы вектора, используя несколько битовоперации и данные готовы:

auto t_map = std::map<CODES, int>(); // CODES is an enum type

std::vector<int64_t> vec;
for (auto&& elemMap : t_map)
{
    int64_t val = elemMap.first;   // store key
    val <<= 32; // shift key
    val |= elemMap.second; // store value

    vec.push_back (val);
}

auto tmp_buffer = boost::asio::buffer(vec); // this is supported

Распаковать вектор на карту должно быть легко.

...