четверг, 25 августа 2016 г.

[prog.c++.flame] Обновим старый CodeSize Battle: Just::Thread Pro vs SObjectizer-5.5.17

Чуть больше года назад появился пост "Очередной CodeSize Battle: Just::Thread Pro vs SObjectizer-5.5.6". Поскольку версию 5.5.6 уже можно считать довольно старой, то имеет смысл привести для сравнения код, адаптированный под актуальный SO-5. Код для Just::Thread Pro не менялся, т.к. я не помню, чтобы Энтони Уильямс обновлял версию своего фреймворка.

Для тех, кто не хочет заглядывать в старый пост поясню, что речь идет от классической задаче с парикмахером, который спит, пока нет посетителей и просыпается, когда посетители появляются. Под катом показаны реализации на Just::Thread Pro и на SO-5.5.17.

Примечание. Реализация на SO-5 не 1-в-1, но очень близко соответствует версии Уильямса. Дабы не писать постоянно so_5::send(m_log,something) и не колупаться с обнулением содержимого std::ostringstream (что довольно часто происходит в версии Уильямса), в SObjectizer-овской версии было переопределено несколько вариантов operator<<=. Но, т.к. определение этих вспомогательных штук в коде присутствует и объем кода несколько раздувает, то это не такое уж и большое читтерство :)

вторник, 23 августа 2016 г.

[prog.c++] Трансформация маленького класса от совсем простого к легкому хардкору с policy-based design

Upd. Расширенная версия этого текста выложена в виде статьи на Хабре.

Дублирование кода не есть хорошо. Поэтому, когда в коде стали часто повторяться очень похожие фрагменты вида:

class dispatcher_t
   {
      ...
      void
      work_started()
         {
            std::lock_guard< activity_traits::lock_t > lock{ m_stats_lock };

            m_is_in_working = true;
            m_work_started_at = so_5::stats::clock_type_t::now();
            m_work_activity.m_count += 1;
         }

      void
      work_finished()
         {
            std::lock_guard< activity_traits::lock_t > lock{ m_stats_lock };

            m_is_in_working = false;
            so_5::stats::details::update_stats_from_current_time(
                  m_work_activity,
                  m_work_started_at );
         }

      so_5::stats::activity_stats_t
      take_work_stats()
         {
            so_5::stats::activity_stats_t result;
            bool is_in_working{ false };
            so_5::stats::clock_type_t::time_point work_started_at;

            {
               std::lock_guard< activity_traits::lock_t > lock{ m_stats_lock };

               result = m_work_activity;
               iftrue == (is_in_working = m_is_in_working) )
                  work_started_at = m_work_started_at;
            }

            if( is_in_working )
               so_5::stats::details::update_stats_from_current_time(
                     result,
                     work_started_at );

            return result;
         }
   };

То захотелось вынести все это дело в отдельный вспомогательный класс. С очень простой реализацией: