Прогресс сериализации цепочки классов.

231
19 декабря 2016, 19:42

Обновил задание на более прикладное: Необходимо выяснить, каков прогресс сериализации объектов классов(ну как полоска загрузки файла с сайта).

Там где объявление классов, в комментариях указаны числа,это то, в каком порядке будет проходить сериализация. Код простой в комментариях описано, что необходимо.

// это макросы которые присутствуют в целевых классах
#define START_SERIALIZATION()\
friend class boost::serialization::access;\
template <typename Archive>\
void serialize(Archive & AR, const unsigned int ver)\
{\
#define STOP_SERIALIZATION()\
}\
// В комментариях указан ПОРЯДОК прохода
struct A
{
int g;
START_SERIALIZATION() // 3  и 8 
AR & g; // 4  и 9
STOP_SERIALIZATION()
};
struct B
{
A a;
START_SERIALIZATION() // 6
AR & a; // 7
STOP_SERIALIZATION()
};
struct C
{
A a;
B b;
START_SERIALIZATION() // 1
AR & a; // 2
AR & b; // 5
STOP_SERIALIZATION()
};
int main()
{
std::system("chcp 1251");
C c;
// вызвали 
std::ofstream file("file.txt");
boost::archive::text_oarchive oa(file);
oa << c; // !! вот отсюда начинается сериализация, дальше смотреть на номера в комментариях при объявлении классов.
//// !!!!
// В момент выполнения 'oa << c;' мне нужно в другом потоке знать процент его выполнения. Например : всего объектов 200 обработано 34. Процент записи классов: 17%
//// !!!!
std::system("pause");
return 0;
}

Идей как таким образом автоматически вычислить процент сохранения класса у меня вообще нет(кроме сохранения результатов предыдущего сохранения(но это будет не точный процент)).

Answer 1

А почему бы не посчитать?

  1. Создание А не конструирует другие объекты, значит, создание А вызывает 1 конструктор.
  2. Создание B конструирует дополнительный А, значит, создание B вызывает 1 + 1 = 2 конструктора.
  3. Создание C конструирует дополнительныe 2 шт. А и 1 шт. B, значит, создание C вызывает 1 + 2 * 1 + 1 * 2 = 5 конструкторов.
  4. main конструирует 1 шт. C, итого всего 5 конструкторов.

Вот автоматическое решение:

#include <boost/preprocessor/seq/for_each.hpp>
#include <boost/preprocessor/seq/elem.hpp>
#include <boost/preprocessor/variadic/to_seq.hpp>
#define CONSTUCTOR_MACRO(r, data, elem) \
        + BOOST_PP_SEQ_ELEM(0, elem) ::NUMBER_OF_CONSTUCTORS
#define FIELD_MACRO(r, data, elem) \
        BOOST_PP_SEQ_ELEM(0, elem) BOOST_PP_SEQ_ELEM(1, elem);
#define SERIALIZATION(...) \
    static const int NUMBER_OF_CONSTUCTORS = 1 \
        BOOST_PP_SEQ_FOR_EACH(\
            CONSTUCTOR_MACRO, _, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)) \
    ; \
    BOOST_PP_SEQ_FOR_EACH(FIELD_MACRO, _, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))
#define SERIALIZATION_Z() \
    static const int NUMBER_OF_CONSTUCTORS = 1;
struct A
{
    SERIALIZATION_Z()
    A(){ std::cout << "\nA()"; } 
};
struct B
{
    SERIALIZATION
    (
        (A)(a)
    )
    B() { std::cout << "\nB()"; }
};
struct C
{
    SERIALIZATION
    (
        (A)(a),
        (B)(b)
    )
    C(){ std::cout << "\nC()"; A a; }
};
int main(int argc, char* argv[])
{
    std::cout << A::NUMBER_OF_CONSTUCTORS << std::endl;
    std::cout << B::NUMBER_OF_CONSTUCTORS << std::endl;
    std::cout << C::NUMBER_OF_CONSTUCTORS << std::endl;
    return 0;
}

Используется boost::preprocessor.

Поля генерируются тем же макросом. Туда же можно «запихнуть» и создание сериализирующей функции.

P. S.: Меня вдохновлял вот этот пример, хотя я и не смог заставить его работать на своей VS 2012.

P. P. S.: Спасибо @perfect за конструктивную критику.

READ ALSO
Произойдёт ли утечка памяти?

Произойдёт ли утечка памяти?

В итоге p1 и p2 будут указывать на один и тот же участок памятиПроизойдёт ли утечка памяти, занятой сначала p1

237
Как правильно формировать criteria для связи HAS_MANY?

Как правильно формировать criteria для связи HAS_MANY?

Есть модель POSTИ есть модель category_r В последней 3 столбца: id, Post_id, category_id

190
Неправильный расчёт даты возврата книг

Неправильный расчёт даты возврата книг

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

194