microavia / messgen

MIT License
9 stars 11 forks source link

Ownership of dynamic values #17

Open nameofuser1 opened 3 years ago

nameofuser1 commented 3 years ago

Иногда полезно иметь возможность сохранить сообщение с динамическими полями. Есть предложение написать класс обертку над сообщением и сделать специализации функций сериализации и парсинга:

class Storage<T> {
    T msg;
     MemoryAllocator mem;
}

int parse<Storage<T>> (Storage<T> &msg, MessageInfo &info)  {
}

Пока конкретный интерфейс не продумывал, но в планах пофантазировать.

Несколько тонких моментов, о которых можно подумать:

  1. В таком случае в общем-то передавать аллокатор/память отдельными аргументами возможно и нет смысла, тк он будет храниться внутри Storage.
  2. Запретить вызовы parse на динамических сообщениях, если при вызове не используется Storage. Можно как-нибудь разделить два варианта вызова, чтобы не тащить лишние аргументы на сообщениях без динамических полей.
  3. Когда будет очищаться аллокатор. Сейчас он конструируется при вызове parse и стирается после выхода, в итоге мануально его сбрасывать не нужно. Возможно в случае со Storage получится обойтись без создания объекта каждый раз и без мануального контроля. Из идей при вызове метода parse на Storage, вызывать функцию reset, которая будет сбрасывать аллокатор.

@ygorshkov @DrTon что думаете? Может есть другие пути?

ygorshkov commented 3 years ago

возможно я не так понял постановку задачи, но хранение аллокатора рядом с сообщением ничего не даст, так как аллокатор сам не владеет никокой памятью

nameofuser1 commented 3 years ago

@ygorshkov да, я не очень ясно выразился. Также я хочу сделать так, чтобы он владел памятью. Примерно как тут, только чтобы конструировать каждый раз не нужно было: https://github.com/microavia/messgen/blob/master/port/cpp/messgen/stl.h