SlideShare ist ein Scribd-Unternehmen logo
1 von 48
Downloaden Sie, um offline zu lesen
Обзор библиотеки Boost

       Попов Владимир


           Video Group
   CS MSU Graphics & Media Lab
Only for
 Maxus 



                Outline

           Boost
               Состав библиотеки
               Лицензия
           Разбор текстовых файлов
           «Умные» указатели



                                            2
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
                 Boost
                 Состав библиотеки
           String and text processing
           Containers
           Iterators
           Algorithms
           Function Objects and higher-order programming
           Generic Programming
           Template Metaprogramming
           Preprocessor Metaprogramming
           Concurrent Programming
           Math and numerics
           Correctness and testing
           Data structures
           Input/Output
           Inter-language support
           Memory (boost::smart_ptr)
           Parsing (boost::spirit)
           Programming Interfaces
           Miscellaneous



                                                            3
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
              Boost
              Лицензия

           http://www.boost.org/users/license.html

           Накладывает ограничения на
            модификацию библиотеки
           Не накладывает ограничения на код,
            использующий библиотеку


                                                      4
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



                Outline
           Boost
           Разбор текстовых файлов
            (boost::spirit)
               Принцип
               Пример использования
               Принцип работы библиотеки
               Встроенные возможности
           «Умные» указатели

                                            5
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
                Boost::spirit
                Разбор текстового файла

           Удобно хранить параметры программы во
            внешних файлах
               Простота изменений
               Не надо перекомпилировать проект
           Но сложно работать со внешними файлами
               Сложный формат тяжело читать
               Если упрощать формат файла, теряется
                гибкость редактирования данных


                                                       6
CS MSU Graphics & Media Lab (Video Group)
Only for


             Boost::spirit
 Maxus 



             Разбор текстового файла


                                        БНФ
       Config.txt
                               Буква (буква | цифра)*



                                           Парсер
                                      switch (state) {
                                   case state_1: … break;
                                   case state_2: … break;
                                              }
                                                            7
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             Boost::spirit
             Разбор текстового файла. YACC(Bizon)


                                                     БНФ
       Config.txt
                                            Буква (буква | цифра)*



          Парсер
     switch (state) {                              Описание грамматики
                                     YACC(BIZON)
  case state_1: … break;                            в текстовом файле
  case state_2: … break;
             }
                                                                         8
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             Boost::spirit
             Разбор текстового файла. Boost::spirit


                                        БНФ
       Config.txt
                               Буква (буква | цифра)*




                                Парсер (код на С++)
                         parse(str,ch_p >> *(ch_p | digit_p));

                                                                 9
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             Boost::spirit
             Алгоритм использования

      1.    Создать правило разбора
      2.    Вызвать функцию parse




                                            10
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             Boost::spirit
             Пример использования

      1.    Прочитать действительное число
                real_p
      2.    Прочитать 2 действительных числа
                real_p >> real_p
      3.    Прочитать произвольное количество
            действительных чисел
                *real_p
      4.    Прочитать последовательность
            действительных чисел через запятую
                real_p >> *(ch_p(',') >> real_p)

                                                   11
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             Boost::spirit
             Алгоритм использования

      1.    Создать правило разбора
      2.    Вызвать функцию parse




                                            12
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             Boost::spirit
             Пример использования (2)

      5.    Вызов функции parse
                parse(str, real_p >> *(',' >> real_p), space_p)
      6.    Обернем вызов в функцию (законченный
            пример)
                bool parse_numbers(char const* str)
                {
                        return parse(str, real_p >> *(',' >> real_p),
                        space_p).full;
                }



                                                                        13
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
                  Boost::spirit
                  Пример использования (3)

      7.         Сохраним список в массив (семантические
                 действия)
                   P – парсер
            a.     F – функция. void F (double);
                   P[&F] – если разбор прошел успешно, вызвать F для
                   аргумента P

            b.     сlass F
                   { public: void operator() (double) { … } }; - функтор
                   P[F ()] – вызов функтора

            c.     std::vector c;
                   push_back_a(c) – встроенный функтор


                                                                           14
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             Boost::spirit
             Пример использования (4)

 bool parse_numbers(const char * str, vector<double>& v)
 {
   return parse(str,
       // Begin grammar
       (
          real_p[push_back_a(v)] >> *(',' >> real_p[push_back_a(v)])
       )
       ,
       // End grammar
       space_p).full;
 }


                                                                       15
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             Boost::spirit
             Принцип работы




      Парсер выполняет работу по разбору строки
      Большой набор встроенных парсеров
      Возможность написать свой
                                                   16
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
              Boost::spirit
              Принцип работы. Парсер

           real_p >> *(',' >> real_p)



           real_p – объект класса
            real_parser (встроенный)
           >>, * - перегруженные
            операторы

                                            17
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
                Boost::spirit
                Принцип работы. Сканер

           Сканер – абстрактная
            концепция
           Состоит из 2-х итераторов – на
            текущее положение в потоке и на его
            конец
           Позволяет настраивать свою работу
               Удалить пробелы
               Не различать регистр букв

                                                  18
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
              Boost::spirit
              Принцип работы. Match

           Задача – сказать,
            прошел ли разбор успешно
           Может содержать данные в случае
            успешного разбора (для real_p –
            действительное число)




                                              19
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
              Boost::spirit
              Принцип работы. Семантические
              действия



           real_p[&f] >> *(',' >> real_p[&f])
           Разбор успешен – вызывается функция
           Что делать с данными – решает функция
              Сохранить в массив

              Сложить все числа




                                                    20
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
               Boost::spirit
               Примитивные парсеры

           anychar_p   Любой символ
           alnum_p     Буквы и цифры
           alpha_p     Буквы
           blank_p     Пробел и символ табуляции
           cntrl_p     Управляющие символы
           digit_p     Цифры
           graph_p     Видимые символы
           lower_p     Прописные буквы
           punct_p     Символы-разделители (запятые, точки с запятой…)
           space_p     Пробелы, табуляция, перевод строки (r и n)
           upper_p     Строчные буквы
           xdigit_p    Цифры в шестнадцатеричной системе счисления



                                                                          21
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
               Boost::spirit
               Примитивные парсеры (2)

           ch_p(„a‟)     – конкретный символ
           str_p(“hello”)– конкретная строка
           uint_p        – беззнаковое целое число
           int_p         – целое число со знаком
           real_p        – число с плавающей запятой




                                                        22
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
               Boost::spirit
               Операторы(1)

           Теоретико-множественные
              a | b - Объединение  Подходит а или b
              a & b - Пересечение  Подходит a и b
              a – b – разность     Подходит a, но не b. Если a
                                    подошло, а для b текст короткий,
                                    то операция успешна
              a ^ b - XOR          Подходит а или b, но не оба
                                    сразу
           Последовательность
              a >> b               Сначала идет а, потом b



                                                                       23
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
                Boost::spirit
                Операторы(2)

           Циклы
               *a      а встречается 0 или больше раз
               +a      а встречается 1 или больше раз
               !a      а встречается 0 или 1 раз

      Пример:
      rule<> r = ch_p('a') | ch_p('b„) | ch_p('c„) | ch_p('d„);   // OK
      r = ch_p('a') | 'b' | 'c' | 'd';   // OK
      r = 'a' | 'b' | 'c' | 'd';  //неправильно


      rule – класс, объекты которого хранят парсер


                                                                          24
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
              Boost::spirit
              Вспомогательные парсеры

           confix_p(start,string,end)
           comment_p(start, end)
           comment_p(start)
           list_p(item,delimeter)




                                            25
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             Boost::spirit
             Действия

      parser[&my_function]
      parser[my_functor]

      class my_functor
      {
      public:
         template<class IteratorT>
         void operator() const (IteratorT begin, IteratorT end)
         { …
         }
      };

                                                                  26
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
                Boost::spirit
                Встроенные действия

           increment_a(ref)
           decrement_a(ref)
           assign_a(ref)
           assign_a(ref, value)
           push_back_a(ref)
           push_back_a(ref, value)
           clear_a(ref)

           Пример:
            bool state;
            vector<double> c;
            double num;
            rule<> r = (str_p(“state_f”)[assign_a(state,false)] |
                            str_p(“state_t”)[assign_a(state,true)]
            ) >> int_p[my_action(state)]
             >> real_p[push_back_a(c)] >> real_p[assign_a(num)];


                                                                     27
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
                Boost::spirit
                Функция parse

           parse (str, rule) – символьный уровень
           parse (str, rule, skip) – уровень фраз

           parse (iterator_begin, iterator_end,…)

           Возвращает parse_info.
               parse_info::hit – прошел ли парсинг успешно
               parse_info::full – был ли считан весь ввод

                                                              28
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             Boost::spirit
             Пример. Конфиг файл
 ###COMMON
 set bitrate=%7
 set /A bitrate = %bitrate%*1024*8
 video_enc_con.exe h261 -i %1 -n %6 -w %3 -h %4 -f %5 -b %bitrate%
                       %PARAMETERS% %PARAMETERS_FILE% %2
 ###END
 ###DECODING                                  …
 move %1 tmp                                  "@"        HEIGHT
 ldecod.exe -i tmp -o %2                      "@"        FRAMES_NUM
 move tmp %1                                  "@"        ENUM      [0,1]     1
 ###END                                       "@"        BITRATE_BPS
 ###PARAMETERS                                "45"       QUOTE
 "-t @"      ENUM [0,1]        1              "@"        ENUM      [0..3]    2
 ###END                                       "@"        ENUM      [0,1]     1
 ###PARAMETERS_FILE                           "@"        ENUM      [“esa”,”umh”] “umh”
 "@"         SOURCE_FILE                      "@"        ENUM      [0,1,2]   0
 "@"         WIDTH                            "@"        ENUM      [0,1]     1
 …                                            "12:11" QUOTE
                                              ###END
                                                                                         33
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             Boost::spirit
             Пример. Чтение конфиг файла
   typedef rule<phrase_scanner_t> rule_t;

   rule_t q_string = confix_p (""", (+anychar_p), """);
   rule_t str_vec = list_p(q_string, ',');
   rule_t int_vec = list_p(uint_p,',');
   rule_t rule_parameter =
   (
    (confix_p (""", (+anychar_p), """) >>
     (str_p ("TOGGLE")      | str_p ("SOURCE_FILE")| str_p ("WIDTH") | str_p ("HEIGHT") |
      str_p ("FRAMES_NUM") | str_p ("BITRATE_BPS")| str_p ("QUOTE") | str_p ("ENUM") >>
      (
        (confix_p ('[', str_vec, ']') >> q_string) |
        (confix_p ('[', (uint_p >> ".." >> uint_p >> !(',' >> uint_p)), ']') >> uint_p) |
        (confix_p ('[', int_vec, ']') >> uint_p)
      )))
   );

   rule_t rule_parameters = *(rule_parameter);
   rule_t rule_paramfile = *(rule_parameter);

   parse_info<> res = parse (pData,
    confix_p ("###COMMON", (*anychar_p), "###END") >>
    confix_p ("###DECODING", (*anychar_p), "###END") >>
    (!confix_p (str_p("###PARAMETERS"), rule_parameters, "###END")) >>
    (!confix_p (str_p("###PARAMETERS_FILE"), rule_paramfile, "###END"))
    ,space_p
   );                                                                                       34
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
              Boost::spirit
              Преимущества и недостатки

      +     Позволяет быстро сделать парсер
            относительно простых данных (компилятор
            С++ писать не рекомендуется)
      +     Хорошая читабельность парсера (можно
            разобрать формат разбираемого текста)

      - Сложность отладки
      - Быстро увеличивается время компиляции с
        увеличением числа правил

                                                      35
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



                Outline
           Boost
           Разбор текстовых файлов
           «Умные» указатели
               Назначение
               Состав
               scoped_ptr
               shared_ptr
               weak_ptr
               intrusive_ptr

                                            36
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
               «Умные» указатели
               Назначение

           Хранят указатель на динамический объект
           Отвечают за удаление объекта в нужное время
                 smart_ptr<int> ptr (new int(5));
                 // delete не нужен
           Отвечают за управление объектом, используемым в нескольких
            местах
                 std::vector<smart_ptr<int> > c;
                 c.push_back(ptr);
                 // указатель удалится из c и из функции в
                 // нужное время автоматически
           Полезны при обработке исключений
                 void f () {
                           smart_ptr<int> ptr (new int (5));
                           throw Exception;
                 }


                                                                         37
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
              «Умные» указатели
              Состав

           scoped_ptr – один владелец объекта. Нельзя
            копировать
           scoped_array – один владелец массива. Нельзя
            копировать
           shared_ptr – несколько владельцев объекта
           shared_array – несколько владельцев массива
           weak_ptr – просмотрщик объекта, который
            содержится в shared_ptr
           intrusive_ptr – несколько владельцев объекта,
            внешний подсчет ссылок


                                                            38
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
              «Умные» указатели
              scoped_ptr

           Работает быстро и не требует
            дополнительной памяти
           Удалит объект автоматически в
            нужное время
           Нельзя копировать и использовать в
            контейнерах Стандартной Библиотеки


                                                 39
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             «Умные» указатели
             scoped_ptr

 namespace boost {
   template<class T> class scoped_ptr : noncopyable {
    public:
      typedef T element_type;
      explicit scoped_ptr(T * p = 0); // never throws
      ~scoped_ptr(); // never throws
      void reset(T * p = 0); // never throws
      T & operator*() const; // never throws
      T * operator->() const; // never throws
      T * get() const; // never throws

        operator bool() const; // never throws
        void swap(scoped_ptr & b); // never throws
   };
   template<class T> void swap(scoped_ptr<T> & a, scoped_ptr<T> & b);
 // never throws
 }

                                                                        40
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
              «Умные» указатели
              scoped_ptr vs auto_ptr

           Не допустить копирование указателя
           Показать будущим разработчикам,
            что указатель не должен
            копироваться
           Эквивалентен std::auto_ptr<T> const,
            но нельзя вызвать reset


                                                   41
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             «Умные» указатели
             scoped_ptr. Пример
 #include <boost/scoped_ptr.hpp>
 #include <iostream>
 struct Shoe { ~Shoe() { std::cout << "Buckle my shoen"; } };
 class MyClass {
     boost::scoped_ptr<int> ptr;
   public:
     MyClass() : ptr(new int) { *ptr = 0; }
     int add_one() { return ++*ptr; }
 };
 int main()
 {
     boost::scoped_ptr<Shoe> x(new Shoe);
     MyClass my_instance;
     std::cout << my_instance.add_one() << 'n';
     std::cout << my_instance.add_one() << 'n';
 }

 Вывод:
 1
 2
 Buckle my shoe
                                                                 42
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
              «Умные» указатели
              shared_ptr

           Поддерживает копирование указателей
           Использует подсчет ссылок
           Автоматически удаляет объект
           Поддерживает преобразование типов
            указателей
            shared_ptr<T1> -> shared_ptr<T2>

           Не работает с циклическими ссылками
            (использовать weak_ptr)

                                                  43
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
                «Умные» указатели
                shared_ptr. Принцип применения

           Каждое создание объекта должно   void f(shared_ptr<int>, int);
            иметь вид:                       int g();
            shared_ptr<T> p(new Y);          void ok()
           Пример:                          {
               Выполняется new int(2)           shared_ptr<int> p(new int(2));
               Выполняется g()                  f(p, g());
               В g выбрасывается            }
                исключение
                                             void bad()
               Результат: указатель не
                создан,                      {
                утечка памяти                    f(shared_ptr<int>(new int(2)),
                                                g());
                                             }




                                                                             44
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             «Умные» указатели
             shared_ptr. Пример
       struct Foo
       {
         Foo( int _x ) : x(_x) {}
         ~Foo() { std::cout << "Destructing a Foo
       with x=" << x << "n"; }
         int x;
         /* ... */
       };
       typedef boost::shared_ptr<Foo> FooPtr;
       struct FooPtrOps
       {
         bool operator()( const FooPtr & a, const
       FooPtr & b )
           { return a->x > b->x; }
         void operator()( const FooPtr & a )
           { std::cout << a->x << "n"; }
       };

                                                    45
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
              «Умные» указатели
              shared_ptr. Пример
 int main()
 {
   std::vector<FooPtr>         foo_vector;
                                             Вывод на экран:
   std::set<FooPtr,FooPtrOps> foo_set;       foo_vector:
  // NOT multiset!
                                             2
   FooPtr foo_ptr( new Foo( 2 ) );
   foo_vector.push_back( foo_ptr );          1
   foo_set.insert( foo_ptr );                3
   foo_ptr.reset( new Foo( 1 ) );
   foo_vector.push_back( foo_ptr );          2
   foo_set.insert( foo_ptr );
   foo_ptr.reset( new Foo( 3 ) );
                                             foo_set:
   foo_vector.push_back( foo_ptr );
   foo_set.insert( foo_ptr );                3
   foo_ptr.reset ( new Foo( 2 ) );           2
   foo_vector.push_back( foo_ptr );
   foo_set.insert( foo_ptr );                1
   std::cout << "foo_vector:n";
   std::for_each( foo_vector.begin(),
                                             Destructing a   Foo   with x=2
 foo_vector.end(), FooPtrOps() );
                                             Destructing a   Foo   with x=1
   std::cout << "nfoo_set:n";              Destructing a   Foo   with x=3
   std::for_each( foo_set.begin(),
 foo_set.end(), FooPtrOps() );               Destructing a   Foo   with x=2
   std::cout << "n";
   return 0;
 }                                                                            46
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
                «Умные» указатели
                weak_ptr

           Хранит слабую ссылку
           Доступ к объекту:
               Конструктор shared_ptr
               Функция shared_ptr<T> lock ()
           Устраняет проблему циклических
            зависимостей
                Внутри объекта содержится ссылка на
                сам объект

                                                      47
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             «Умные» указатели
             weak_ptr. Пример

                   shared_ptr<int> p(new int(5));
                   weak_ptr<int> q(p);

                   // some time later

                   if(shared_ptr<int> r = q.lock())
                   {
                       // use *r
                   }




                                                      48
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
                «Умные» указатели
                intrusive_ptr

           Внешний подсчет ссылок
               При копировании вызвает
                intrusive_ptr_add_ref(T* p), p – указатель
               При удалении –
                intrusive_ptr_release(T* p)
           Объект класса intrusive_ptr занимает в
            памяти столько же места, как и обычный
            указатель
                sizeof (intrusive_ptr<T>) = sizeof (T*)

                                                             49
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             «Умные» указатели
             intrusive_ptr. Пример
 class base                            inline void intrusive_ptr_add_ref(base * p)
 {                                     {
 private:                                  p->add_ref();
     int use_count_;                   }
 public:                               inline void intrusive_ptr_release(base * p)
     base(): use_count_(0)             {
     {                                     p->release();
     }                                 }
     virtual ~base()                   int main ()
     {                                 {
     }                                     intrusive_ptr<base*> p (new base ());
                                       }
      void add_ref()
      {
          ++use_count_;
      }
      void release()
      {
          if(--use_count_ == 0)
           delete this;
      }
 };
                                                                                     50
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



             http://www.boost.org




                                            51
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



             Вопросы




                                            ?
                                                52
CS MSU Graphics & Media Lab (Video Group)

Weitere ähnliche Inhalte

Ähnlich wie Обзор библиотеки Boost

Обзор открытых библиотек в области обработки изображений и компьютерного зрения
Обзор открытых библиотек в области обработки изображений и компьютерного зренияОбзор открытых библиотек в области обработки изображений и компьютерного зрения
Обзор открытых библиотек в области обработки изображений и компьютерного зрения
MSU GML VideoGroup
 
Анализ парапетров кодеков
Анализ парапетров кодековАнализ парапетров кодеков
Анализ парапетров кодеков
MSU GML VideoGroup
 
Обзор новинок в области GPGPU
Обзор новинок в области GPGPUОбзор новинок в области GPGPU
Обзор новинок в области GPGPU
MSU GML VideoGroup
 
Методы оптимизации вычислений на CPU
Методы оптимизации вычислений на CPUМетоды оптимизации вычислений на CPU
Методы оптимизации вычислений на CPU
MSU GML VideoGroup
 
Декодирование видео на GPU
Декодирование видео на GPUДекодирование видео на GPU
Декодирование видео на GPU
MSU GML VideoGroup
 
Обзор некоторых современных SoC
Обзор некоторых современных SoCОбзор некоторых современных SoC
Обзор некоторых современных SoC
MSU GML VideoGroup
 
Обзор стандарта H.265/HEVC
Обзор стандарта H.265/HEVCОбзор стандарта H.265/HEVC
Обзор стандарта H.265/HEVC
MSU GML VideoGroup
 
Обзор алгоритмов машинного обучения
Обзор алгоритмов машинного обученияОбзор алгоритмов машинного обучения
Обзор алгоритмов машинного обучения
MSU GML VideoGroup
 
Новые методы деинтерлейсинга
Новые методы деинтерлейсингаНовые методы деинтерлейсинга
Новые методы деинтерлейсинга
MSU GML VideoGroup
 
Обзор процессоров Phillips Nexperia
Обзор процессоров Phillips NexperiaОбзор процессоров Phillips Nexperia
Обзор процессоров Phillips Nexperia
MSU GML VideoGroup
 
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва... Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Nikolay Samokhvalov
 
Обзор подходов к измерению качества 3D видео
Обзор подходов к измерению качества 3D видеоОбзор подходов к измерению качества 3D видео
Обзор подходов к измерению качества 3D видео
MSU GML VideoGroup
 
Обзор методов обнаружения ошибок в видео
Обзор методов обнаружения ошибок в видеоОбзор методов обнаружения ошибок в видео
Обзор методов обнаружения ошибок в видео
MSU GML VideoGroup
 
Cравнение средств разработки RIA приложений используя Flash платформу
Cравнение средств разработки RIA приложений используя Flash платформуCравнение средств разработки RIA приложений используя Flash платформу
Cравнение средств разработки RIA приложений используя Flash платформу
ilja.panin
 
Распознавание и удаление субтитров
Распознавание и удаление субтитровРаспознавание и удаление субтитров
Распознавание и удаление субтитров
MSU GML VideoGroup
 

Ähnlich wie Обзор библиотеки Boost (20)

Обзор открытых библиотек в области обработки изображений и компьютерного зрения
Обзор открытых библиотек в области обработки изображений и компьютерного зренияОбзор открытых библиотек в области обработки изображений и компьютерного зрения
Обзор открытых библиотек в области обработки изображений и компьютерного зрения
 
Анализ парапетров кодеков
Анализ парапетров кодековАнализ парапетров кодеков
Анализ парапетров кодеков
 
Обзор новинок в области GPGPU
Обзор новинок в области GPGPUОбзор новинок в области GPGPU
Обзор новинок в области GPGPU
 
Обзор OpenCL
Обзор OpenCLОбзор OpenCL
Обзор OpenCL
 
Методы оптимизации вычислений на CPU
Методы оптимизации вычислений на CPUМетоды оптимизации вычислений на CPU
Методы оптимизации вычислений на CPU
 
Декодирование видео на GPU
Декодирование видео на GPUДекодирование видео на GPU
Декодирование видео на GPU
 
Обзор некоторых современных SoC
Обзор некоторых современных SoCОбзор некоторых современных SoC
Обзор некоторых современных SoC
 
Обзор стандарта H.265/HEVC
Обзор стандарта H.265/HEVCОбзор стандарта H.265/HEVC
Обзор стандарта H.265/HEVC
 
Обзор алгоритмов машинного обучения
Обзор алгоритмов машинного обученияОбзор алгоритмов машинного обучения
Обзор алгоритмов машинного обучения
 
Новые методы деинтерлейсинга
Новые методы деинтерлейсингаНовые методы деинтерлейсинга
Новые методы деинтерлейсинга
 
Обзор процессоров Phillips Nexperia
Обзор процессоров Phillips NexperiaОбзор процессоров Phillips Nexperia
Обзор процессоров Phillips Nexperia
 
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва... Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 
Обзор подходов к измерению качества 3D видео
Обзор подходов к измерению качества 3D видеоОбзор подходов к измерению качества 3D видео
Обзор подходов к измерению качества 3D видео
 
Deringing Cartoons
Deringing CartoonsDeringing Cartoons
Deringing Cartoons
 
Пути увеличения эффективности реализации алгоритмов машинного обучения
Пути увеличения эффективности реализации алгоритмов машинного обученияПути увеличения эффективности реализации алгоритмов машинного обучения
Пути увеличения эффективности реализации алгоритмов машинного обучения
 
PostgreSQL on sas/ssd/nvme/nvdimm
PostgreSQL on sas/ssd/nvme/nvdimmPostgreSQL on sas/ssd/nvme/nvdimm
PostgreSQL on sas/ssd/nvme/nvdimm
 
Обзор методов обнаружения ошибок в видео
Обзор методов обнаружения ошибок в видеоОбзор методов обнаружения ошибок в видео
Обзор методов обнаружения ошибок в видео
 
Cравнение средств разработки RIA приложений используя Flash платформу
Cравнение средств разработки RIA приложений используя Flash платформуCравнение средств разработки RIA приложений используя Flash платформу
Cравнение средств разработки RIA приложений используя Flash платформу
 
Распознавание и удаление субтитров
Распознавание и удаление субтитровРаспознавание и удаление субтитров
Распознавание и удаление субтитров
 
DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...
DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...
DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...
 

Mehr von MSU GML VideoGroup

Обзор алгоритмов генерации ракурсов для многоракурсных видео
Обзор алгоритмов генерации ракурсов для многоракурсных видеоОбзор алгоритмов генерации ракурсов для многоракурсных видео
Обзор алгоритмов генерации ракурсов для многоракурсных видео
MSU GML VideoGroup
 
Некоторые методы сегментации видео
Некоторые методы сегментации видеоНекоторые методы сегментации видео
Некоторые методы сегментации видео
MSU GML VideoGroup
 
Обзор методов сравнения фильмов
Обзор методов сравнения фильмовОбзор методов сравнения фильмов
Обзор методов сравнения фильмов
MSU GML VideoGroup
 
Обзор методов оценки True-motion
Обзор методов оценки True-motionОбзор методов оценки True-motion
Обзор методов оценки True-motion
MSU GML VideoGroup
 
Методы цветокоррекции стереовидео
Методы цветокоррекции стереовидеоМетоды цветокоррекции стереовидео
Методы цветокоррекции стереовидео
MSU GML VideoGroup
 
Некоторые методы сопоставления стерео
Некоторые методы сопоставления стереоНекоторые методы сопоставления стерео
Некоторые методы сопоставления стерео
MSU GML VideoGroup
 
Некоторые алгоритмы многомерной обработки изображений
Некоторые алгоритмы многомерной обработки изображенийНекоторые алгоритмы многомерной обработки изображений
Некоторые алгоритмы многомерной обработки изображений
MSU GML VideoGroup
 
Некоторые методы обнаружения артефактов 3D-видео
Некоторые методы обнаружения артефактов 3D-видеоНекоторые методы обнаружения артефактов 3D-видео
Некоторые методы обнаружения артефактов 3D-видео
MSU GML VideoGroup
 
Способы построения и оценки карт салиентности
Способы построения и оценки карт салиентностиСпособы построения и оценки карт салиентности
Способы построения и оценки карт салиентности
MSU GML VideoGroup
 
Некоторые методы проектирования и оптимизации кода
Некоторые методы проектирования и оптимизации кодаНекоторые методы проектирования и оптимизации кода
Некоторые методы проектирования и оптимизации кода
MSU GML VideoGroup
 
Обзор методов сопоставления шаблона и изображения
Обзор методов сопоставления шаблона и изображенияОбзор методов сопоставления шаблона и изображения
Обзор методов сопоставления шаблона и изображения
MSU GML VideoGroup
 
Способы построения saliency map
Способы построения saliency mapСпособы построения saliency map
Способы построения saliency map
MSU GML VideoGroup
 
Research & Development методы, проблемы и ошибки
Research & Development методы, проблемы и ошибкиResearch & Development методы, проблемы и ошибки
Research & Development методы, проблемы и ошибки
MSU GML VideoGroup
 
Обзор алгоритмов трекинга объектов
Обзор алгоритмов трекинга объектовОбзор алгоритмов трекинга объектов
Обзор алгоритмов трекинга объектов
MSU GML VideoGroup
 
Некоторые методы генерации многоракурсных изображений на основе карты глубины
Некоторые методы генерации многоракурсных изображений на основе карты глубиныНекоторые методы генерации многоракурсных изображений на основе карты глубины
Некоторые методы генерации многоракурсных изображений на основе карты глубины
MSU GML VideoGroup
 
Использование областей перекрытия в задаче сегментации видео
Использование областей перекрытия в задаче сегментации видеоИспользование областей перекрытия в задаче сегментации видео
Использование областей перекрытия в задаче сегментации видео
MSU GML VideoGroup
 
Обзор докладов конференции IC3D 2012
Обзор докладов конференции IC3D 2012Обзор докладов конференции IC3D 2012
Обзор докладов конференции IC3D 2012
MSU GML VideoGroup
 
Алгоритмы для задачи матирования
Алгоритмы для задачи матированияАлгоритмы для задачи матирования
Алгоритмы для задачи матирования
MSU GML VideoGroup
 
Исправление различий резкости в 3D видео
Исправление различий резкости в 3D видеоИсправление различий резкости в 3D видео
Исправление различий резкости в 3D видео
MSU GML VideoGroup
 
Методы повышения визуального качества восстановленного фона (часть 2)
Методы повышения визуального качества восстановленного фона (часть 2)Методы повышения визуального качества восстановленного фона (часть 2)
Методы повышения визуального качества восстановленного фона (часть 2)
MSU GML VideoGroup
 

Mehr von MSU GML VideoGroup (20)

Обзор алгоритмов генерации ракурсов для многоракурсных видео
Обзор алгоритмов генерации ракурсов для многоракурсных видеоОбзор алгоритмов генерации ракурсов для многоракурсных видео
Обзор алгоритмов генерации ракурсов для многоракурсных видео
 
Некоторые методы сегментации видео
Некоторые методы сегментации видеоНекоторые методы сегментации видео
Некоторые методы сегментации видео
 
Обзор методов сравнения фильмов
Обзор методов сравнения фильмовОбзор методов сравнения фильмов
Обзор методов сравнения фильмов
 
Обзор методов оценки True-motion
Обзор методов оценки True-motionОбзор методов оценки True-motion
Обзор методов оценки True-motion
 
Методы цветокоррекции стереовидео
Методы цветокоррекции стереовидеоМетоды цветокоррекции стереовидео
Методы цветокоррекции стереовидео
 
Некоторые методы сопоставления стерео
Некоторые методы сопоставления стереоНекоторые методы сопоставления стерео
Некоторые методы сопоставления стерео
 
Некоторые алгоритмы многомерной обработки изображений
Некоторые алгоритмы многомерной обработки изображенийНекоторые алгоритмы многомерной обработки изображений
Некоторые алгоритмы многомерной обработки изображений
 
Некоторые методы обнаружения артефактов 3D-видео
Некоторые методы обнаружения артефактов 3D-видеоНекоторые методы обнаружения артефактов 3D-видео
Некоторые методы обнаружения артефактов 3D-видео
 
Способы построения и оценки карт салиентности
Способы построения и оценки карт салиентностиСпособы построения и оценки карт салиентности
Способы построения и оценки карт салиентности
 
Некоторые методы проектирования и оптимизации кода
Некоторые методы проектирования и оптимизации кодаНекоторые методы проектирования и оптимизации кода
Некоторые методы проектирования и оптимизации кода
 
Обзор методов сопоставления шаблона и изображения
Обзор методов сопоставления шаблона и изображенияОбзор методов сопоставления шаблона и изображения
Обзор методов сопоставления шаблона и изображения
 
Способы построения saliency map
Способы построения saliency mapСпособы построения saliency map
Способы построения saliency map
 
Research & Development методы, проблемы и ошибки
Research & Development методы, проблемы и ошибкиResearch & Development методы, проблемы и ошибки
Research & Development методы, проблемы и ошибки
 
Обзор алгоритмов трекинга объектов
Обзор алгоритмов трекинга объектовОбзор алгоритмов трекинга объектов
Обзор алгоритмов трекинга объектов
 
Некоторые методы генерации многоракурсных изображений на основе карты глубины
Некоторые методы генерации многоракурсных изображений на основе карты глубиныНекоторые методы генерации многоракурсных изображений на основе карты глубины
Некоторые методы генерации многоракурсных изображений на основе карты глубины
 
Использование областей перекрытия в задаче сегментации видео
Использование областей перекрытия в задаче сегментации видеоИспользование областей перекрытия в задаче сегментации видео
Использование областей перекрытия в задаче сегментации видео
 
Обзор докладов конференции IC3D 2012
Обзор докладов конференции IC3D 2012Обзор докладов конференции IC3D 2012
Обзор докладов конференции IC3D 2012
 
Алгоритмы для задачи матирования
Алгоритмы для задачи матированияАлгоритмы для задачи матирования
Алгоритмы для задачи матирования
 
Исправление различий резкости в 3D видео
Исправление различий резкости в 3D видеоИсправление различий резкости в 3D видео
Исправление различий резкости в 3D видео
 
Методы повышения визуального качества восстановленного фона (часть 2)
Методы повышения визуального качества восстановленного фона (часть 2)Методы повышения визуального качества восстановленного фона (часть 2)
Методы повышения визуального качества восстановленного фона (часть 2)
 

Обзор библиотеки Boost

  • 1. Обзор библиотеки Boost Попов Владимир Video Group CS MSU Graphics & Media Lab
  • 2. Only for Maxus  Outline  Boost  Состав библиотеки  Лицензия  Разбор текстовых файлов  «Умные» указатели 2 CS MSU Graphics & Media Lab (Video Group)
  • 3. Only for Maxus  Boost Состав библиотеки  String and text processing  Containers  Iterators  Algorithms  Function Objects and higher-order programming  Generic Programming  Template Metaprogramming  Preprocessor Metaprogramming  Concurrent Programming  Math and numerics  Correctness and testing  Data structures  Input/Output  Inter-language support  Memory (boost::smart_ptr)  Parsing (boost::spirit)  Programming Interfaces  Miscellaneous 3 CS MSU Graphics & Media Lab (Video Group)
  • 4. Only for Maxus  Boost Лицензия  http://www.boost.org/users/license.html  Накладывает ограничения на модификацию библиотеки  Не накладывает ограничения на код, использующий библиотеку 4 CS MSU Graphics & Media Lab (Video Group)
  • 5. Only for Maxus  Outline  Boost  Разбор текстовых файлов (boost::spirit)  Принцип  Пример использования  Принцип работы библиотеки  Встроенные возможности  «Умные» указатели 5 CS MSU Graphics & Media Lab (Video Group)
  • 6. Only for Maxus  Boost::spirit Разбор текстового файла  Удобно хранить параметры программы во внешних файлах  Простота изменений  Не надо перекомпилировать проект  Но сложно работать со внешними файлами  Сложный формат тяжело читать  Если упрощать формат файла, теряется гибкость редактирования данных 6 CS MSU Graphics & Media Lab (Video Group)
  • 7. Only for Boost::spirit Maxus  Разбор текстового файла БНФ Config.txt Буква (буква | цифра)* Парсер switch (state) { case state_1: … break; case state_2: … break; } 7 CS MSU Graphics & Media Lab (Video Group)
  • 8. Only for Maxus  Boost::spirit Разбор текстового файла. YACC(Bizon) БНФ Config.txt Буква (буква | цифра)* Парсер switch (state) { Описание грамматики YACC(BIZON) case state_1: … break; в текстовом файле case state_2: … break; } 8 CS MSU Graphics & Media Lab (Video Group)
  • 9. Only for Maxus  Boost::spirit Разбор текстового файла. Boost::spirit БНФ Config.txt Буква (буква | цифра)* Парсер (код на С++) parse(str,ch_p >> *(ch_p | digit_p)); 9 CS MSU Graphics & Media Lab (Video Group)
  • 10. Only for Maxus  Boost::spirit Алгоритм использования 1. Создать правило разбора 2. Вызвать функцию parse 10 CS MSU Graphics & Media Lab (Video Group)
  • 11. Only for Maxus  Boost::spirit Пример использования 1. Прочитать действительное число real_p 2. Прочитать 2 действительных числа real_p >> real_p 3. Прочитать произвольное количество действительных чисел *real_p 4. Прочитать последовательность действительных чисел через запятую real_p >> *(ch_p(',') >> real_p) 11 CS MSU Graphics & Media Lab (Video Group)
  • 12. Only for Maxus  Boost::spirit Алгоритм использования 1. Создать правило разбора 2. Вызвать функцию parse 12 CS MSU Graphics & Media Lab (Video Group)
  • 13. Only for Maxus  Boost::spirit Пример использования (2) 5. Вызов функции parse parse(str, real_p >> *(',' >> real_p), space_p) 6. Обернем вызов в функцию (законченный пример) bool parse_numbers(char const* str) { return parse(str, real_p >> *(',' >> real_p), space_p).full; } 13 CS MSU Graphics & Media Lab (Video Group)
  • 14. Only for Maxus  Boost::spirit Пример использования (3) 7. Сохраним список в массив (семантические действия) P – парсер a. F – функция. void F (double); P[&F] – если разбор прошел успешно, вызвать F для аргумента P b. сlass F { public: void operator() (double) { … } }; - функтор P[F ()] – вызов функтора c. std::vector c; push_back_a(c) – встроенный функтор 14 CS MSU Graphics & Media Lab (Video Group)
  • 15. Only for Maxus  Boost::spirit Пример использования (4) bool parse_numbers(const char * str, vector<double>& v) { return parse(str, // Begin grammar ( real_p[push_back_a(v)] >> *(',' >> real_p[push_back_a(v)]) ) , // End grammar space_p).full; } 15 CS MSU Graphics & Media Lab (Video Group)
  • 16. Only for Maxus  Boost::spirit Принцип работы  Парсер выполняет работу по разбору строки  Большой набор встроенных парсеров  Возможность написать свой 16 CS MSU Graphics & Media Lab (Video Group)
  • 17. Only for Maxus  Boost::spirit Принцип работы. Парсер  real_p >> *(',' >> real_p)  real_p – объект класса real_parser (встроенный)  >>, * - перегруженные операторы 17 CS MSU Graphics & Media Lab (Video Group)
  • 18. Only for Maxus  Boost::spirit Принцип работы. Сканер  Сканер – абстрактная концепция  Состоит из 2-х итераторов – на текущее положение в потоке и на его конец  Позволяет настраивать свою работу  Удалить пробелы  Не различать регистр букв 18 CS MSU Graphics & Media Lab (Video Group)
  • 19. Only for Maxus  Boost::spirit Принцип работы. Match  Задача – сказать, прошел ли разбор успешно  Может содержать данные в случае успешного разбора (для real_p – действительное число) 19 CS MSU Graphics & Media Lab (Video Group)
  • 20. Only for Maxus  Boost::spirit Принцип работы. Семантические действия  real_p[&f] >> *(',' >> real_p[&f])  Разбор успешен – вызывается функция  Что делать с данными – решает функция  Сохранить в массив  Сложить все числа 20 CS MSU Graphics & Media Lab (Video Group)
  • 21. Only for Maxus  Boost::spirit Примитивные парсеры  anychar_p Любой символ  alnum_p Буквы и цифры  alpha_p Буквы  blank_p Пробел и символ табуляции  cntrl_p Управляющие символы  digit_p Цифры  graph_p Видимые символы  lower_p Прописные буквы  punct_p Символы-разделители (запятые, точки с запятой…)  space_p Пробелы, табуляция, перевод строки (r и n)  upper_p Строчные буквы  xdigit_p Цифры в шестнадцатеричной системе счисления 21 CS MSU Graphics & Media Lab (Video Group)
  • 22. Only for Maxus  Boost::spirit Примитивные парсеры (2)  ch_p(„a‟) – конкретный символ  str_p(“hello”)– конкретная строка  uint_p – беззнаковое целое число  int_p – целое число со знаком  real_p – число с плавающей запятой 22 CS MSU Graphics & Media Lab (Video Group)
  • 23. Only for Maxus  Boost::spirit Операторы(1)  Теоретико-множественные  a | b - Объединение Подходит а или b  a & b - Пересечение Подходит a и b  a – b – разность Подходит a, но не b. Если a подошло, а для b текст короткий, то операция успешна  a ^ b - XOR Подходит а или b, но не оба сразу  Последовательность  a >> b Сначала идет а, потом b 23 CS MSU Graphics & Media Lab (Video Group)
  • 24. Only for Maxus  Boost::spirit Операторы(2)  Циклы  *a а встречается 0 или больше раз  +a а встречается 1 или больше раз  !a а встречается 0 или 1 раз Пример: rule<> r = ch_p('a') | ch_p('b„) | ch_p('c„) | ch_p('d„); // OK r = ch_p('a') | 'b' | 'c' | 'd'; // OK r = 'a' | 'b' | 'c' | 'd'; //неправильно rule – класс, объекты которого хранят парсер 24 CS MSU Graphics & Media Lab (Video Group)
  • 25. Only for Maxus  Boost::spirit Вспомогательные парсеры  confix_p(start,string,end)  comment_p(start, end)  comment_p(start)  list_p(item,delimeter) 25 CS MSU Graphics & Media Lab (Video Group)
  • 26. Only for Maxus  Boost::spirit Действия parser[&my_function] parser[my_functor] class my_functor { public: template<class IteratorT> void operator() const (IteratorT begin, IteratorT end) { … } }; 26 CS MSU Graphics & Media Lab (Video Group)
  • 27. Only for Maxus  Boost::spirit Встроенные действия  increment_a(ref)  decrement_a(ref)  assign_a(ref)  assign_a(ref, value)  push_back_a(ref)  push_back_a(ref, value)  clear_a(ref)  Пример: bool state; vector<double> c; double num; rule<> r = (str_p(“state_f”)[assign_a(state,false)] | str_p(“state_t”)[assign_a(state,true)] ) >> int_p[my_action(state)] >> real_p[push_back_a(c)] >> real_p[assign_a(num)]; 27 CS MSU Graphics & Media Lab (Video Group)
  • 28. Only for Maxus  Boost::spirit Функция parse  parse (str, rule) – символьный уровень  parse (str, rule, skip) – уровень фраз  parse (iterator_begin, iterator_end,…)  Возвращает parse_info.  parse_info::hit – прошел ли парсинг успешно  parse_info::full – был ли считан весь ввод 28 CS MSU Graphics & Media Lab (Video Group)
  • 29. Only for Maxus  Boost::spirit Пример. Конфиг файл ###COMMON set bitrate=%7 set /A bitrate = %bitrate%*1024*8 video_enc_con.exe h261 -i %1 -n %6 -w %3 -h %4 -f %5 -b %bitrate% %PARAMETERS% %PARAMETERS_FILE% %2 ###END ###DECODING … move %1 tmp "@" HEIGHT ldecod.exe -i tmp -o %2 "@" FRAMES_NUM move tmp %1 "@" ENUM [0,1] 1 ###END "@" BITRATE_BPS ###PARAMETERS "45" QUOTE "-t @" ENUM [0,1] 1 "@" ENUM [0..3] 2 ###END "@" ENUM [0,1] 1 ###PARAMETERS_FILE "@" ENUM [“esa”,”umh”] “umh” "@" SOURCE_FILE "@" ENUM [0,1,2] 0 "@" WIDTH "@" ENUM [0,1] 1 … "12:11" QUOTE ###END 33 CS MSU Graphics & Media Lab (Video Group)
  • 30. Only for Maxus  Boost::spirit Пример. Чтение конфиг файла typedef rule<phrase_scanner_t> rule_t; rule_t q_string = confix_p (""", (+anychar_p), """); rule_t str_vec = list_p(q_string, ','); rule_t int_vec = list_p(uint_p,','); rule_t rule_parameter = ( (confix_p (""", (+anychar_p), """) >> (str_p ("TOGGLE") | str_p ("SOURCE_FILE")| str_p ("WIDTH") | str_p ("HEIGHT") | str_p ("FRAMES_NUM") | str_p ("BITRATE_BPS")| str_p ("QUOTE") | str_p ("ENUM") >> ( (confix_p ('[', str_vec, ']') >> q_string) | (confix_p ('[', (uint_p >> ".." >> uint_p >> !(',' >> uint_p)), ']') >> uint_p) | (confix_p ('[', int_vec, ']') >> uint_p) ))) ); rule_t rule_parameters = *(rule_parameter); rule_t rule_paramfile = *(rule_parameter); parse_info<> res = parse (pData, confix_p ("###COMMON", (*anychar_p), "###END") >> confix_p ("###DECODING", (*anychar_p), "###END") >> (!confix_p (str_p("###PARAMETERS"), rule_parameters, "###END")) >> (!confix_p (str_p("###PARAMETERS_FILE"), rule_paramfile, "###END")) ,space_p ); 34 CS MSU Graphics & Media Lab (Video Group)
  • 31. Only for Maxus  Boost::spirit Преимущества и недостатки + Позволяет быстро сделать парсер относительно простых данных (компилятор С++ писать не рекомендуется) + Хорошая читабельность парсера (можно разобрать формат разбираемого текста) - Сложность отладки - Быстро увеличивается время компиляции с увеличением числа правил 35 CS MSU Graphics & Media Lab (Video Group)
  • 32. Only for Maxus  Outline  Boost  Разбор текстовых файлов  «Умные» указатели  Назначение  Состав  scoped_ptr  shared_ptr  weak_ptr  intrusive_ptr 36 CS MSU Graphics & Media Lab (Video Group)
  • 33. Only for Maxus  «Умные» указатели Назначение  Хранят указатель на динамический объект  Отвечают за удаление объекта в нужное время smart_ptr<int> ptr (new int(5)); // delete не нужен  Отвечают за управление объектом, используемым в нескольких местах std::vector<smart_ptr<int> > c; c.push_back(ptr); // указатель удалится из c и из функции в // нужное время автоматически  Полезны при обработке исключений void f () { smart_ptr<int> ptr (new int (5)); throw Exception; } 37 CS MSU Graphics & Media Lab (Video Group)
  • 34. Only for Maxus  «Умные» указатели Состав  scoped_ptr – один владелец объекта. Нельзя копировать  scoped_array – один владелец массива. Нельзя копировать  shared_ptr – несколько владельцев объекта  shared_array – несколько владельцев массива  weak_ptr – просмотрщик объекта, который содержится в shared_ptr  intrusive_ptr – несколько владельцев объекта, внешний подсчет ссылок 38 CS MSU Graphics & Media Lab (Video Group)
  • 35. Only for Maxus  «Умные» указатели scoped_ptr  Работает быстро и не требует дополнительной памяти  Удалит объект автоматически в нужное время  Нельзя копировать и использовать в контейнерах Стандартной Библиотеки 39 CS MSU Graphics & Media Lab (Video Group)
  • 36. Only for Maxus  «Умные» указатели scoped_ptr namespace boost { template<class T> class scoped_ptr : noncopyable { public: typedef T element_type; explicit scoped_ptr(T * p = 0); // never throws ~scoped_ptr(); // never throws void reset(T * p = 0); // never throws T & operator*() const; // never throws T * operator->() const; // never throws T * get() const; // never throws operator bool() const; // never throws void swap(scoped_ptr & b); // never throws }; template<class T> void swap(scoped_ptr<T> & a, scoped_ptr<T> & b); // never throws } 40 CS MSU Graphics & Media Lab (Video Group)
  • 37. Only for Maxus  «Умные» указатели scoped_ptr vs auto_ptr  Не допустить копирование указателя  Показать будущим разработчикам, что указатель не должен копироваться  Эквивалентен std::auto_ptr<T> const, но нельзя вызвать reset 41 CS MSU Graphics & Media Lab (Video Group)
  • 38. Only for Maxus  «Умные» указатели scoped_ptr. Пример #include <boost/scoped_ptr.hpp> #include <iostream> struct Shoe { ~Shoe() { std::cout << "Buckle my shoen"; } }; class MyClass { boost::scoped_ptr<int> ptr; public: MyClass() : ptr(new int) { *ptr = 0; } int add_one() { return ++*ptr; } }; int main() { boost::scoped_ptr<Shoe> x(new Shoe); MyClass my_instance; std::cout << my_instance.add_one() << 'n'; std::cout << my_instance.add_one() << 'n'; } Вывод: 1 2 Buckle my shoe 42 CS MSU Graphics & Media Lab (Video Group)
  • 39. Only for Maxus  «Умные» указатели shared_ptr  Поддерживает копирование указателей  Использует подсчет ссылок  Автоматически удаляет объект  Поддерживает преобразование типов указателей shared_ptr<T1> -> shared_ptr<T2>  Не работает с циклическими ссылками (использовать weak_ptr) 43 CS MSU Graphics & Media Lab (Video Group)
  • 40. Only for Maxus  «Умные» указатели shared_ptr. Принцип применения  Каждое создание объекта должно void f(shared_ptr<int>, int); иметь вид: int g(); shared_ptr<T> p(new Y); void ok()  Пример: {  Выполняется new int(2) shared_ptr<int> p(new int(2));  Выполняется g() f(p, g());  В g выбрасывается } исключение void bad()  Результат: указатель не создан, { утечка памяти f(shared_ptr<int>(new int(2)), g()); } 44 CS MSU Graphics & Media Lab (Video Group)
  • 41. Only for Maxus  «Умные» указатели shared_ptr. Пример struct Foo { Foo( int _x ) : x(_x) {} ~Foo() { std::cout << "Destructing a Foo with x=" << x << "n"; } int x; /* ... */ }; typedef boost::shared_ptr<Foo> FooPtr; struct FooPtrOps { bool operator()( const FooPtr & a, const FooPtr & b ) { return a->x > b->x; } void operator()( const FooPtr & a ) { std::cout << a->x << "n"; } }; 45 CS MSU Graphics & Media Lab (Video Group)
  • 42. Only for Maxus  «Умные» указатели shared_ptr. Пример int main() { std::vector<FooPtr> foo_vector; Вывод на экран: std::set<FooPtr,FooPtrOps> foo_set; foo_vector: // NOT multiset! 2 FooPtr foo_ptr( new Foo( 2 ) ); foo_vector.push_back( foo_ptr ); 1 foo_set.insert( foo_ptr ); 3 foo_ptr.reset( new Foo( 1 ) ); foo_vector.push_back( foo_ptr ); 2 foo_set.insert( foo_ptr ); foo_ptr.reset( new Foo( 3 ) ); foo_set: foo_vector.push_back( foo_ptr ); foo_set.insert( foo_ptr ); 3 foo_ptr.reset ( new Foo( 2 ) ); 2 foo_vector.push_back( foo_ptr ); foo_set.insert( foo_ptr ); 1 std::cout << "foo_vector:n"; std::for_each( foo_vector.begin(), Destructing a Foo with x=2 foo_vector.end(), FooPtrOps() ); Destructing a Foo with x=1 std::cout << "nfoo_set:n"; Destructing a Foo with x=3 std::for_each( foo_set.begin(), foo_set.end(), FooPtrOps() ); Destructing a Foo with x=2 std::cout << "n"; return 0; } 46 CS MSU Graphics & Media Lab (Video Group)
  • 43. Only for Maxus  «Умные» указатели weak_ptr  Хранит слабую ссылку  Доступ к объекту:  Конструктор shared_ptr  Функция shared_ptr<T> lock ()  Устраняет проблему циклических зависимостей Внутри объекта содержится ссылка на сам объект 47 CS MSU Graphics & Media Lab (Video Group)
  • 44. Only for Maxus  «Умные» указатели weak_ptr. Пример shared_ptr<int> p(new int(5)); weak_ptr<int> q(p); // some time later if(shared_ptr<int> r = q.lock()) { // use *r } 48 CS MSU Graphics & Media Lab (Video Group)
  • 45. Only for Maxus  «Умные» указатели intrusive_ptr  Внешний подсчет ссылок  При копировании вызвает intrusive_ptr_add_ref(T* p), p – указатель  При удалении – intrusive_ptr_release(T* p)  Объект класса intrusive_ptr занимает в памяти столько же места, как и обычный указатель sizeof (intrusive_ptr<T>) = sizeof (T*) 49 CS MSU Graphics & Media Lab (Video Group)
  • 46. Only for Maxus  «Умные» указатели intrusive_ptr. Пример class base inline void intrusive_ptr_add_ref(base * p) { { private: p->add_ref(); int use_count_; } public: inline void intrusive_ptr_release(base * p) base(): use_count_(0) { { p->release(); } } virtual ~base() int main () { { } intrusive_ptr<base*> p (new base ()); } void add_ref() { ++use_count_; } void release() { if(--use_count_ == 0) delete this; } }; 50 CS MSU Graphics & Media Lab (Video Group)
  • 47. Only for Maxus  http://www.boost.org 51 CS MSU Graphics & Media Lab (Video Group)
  • 48. Only for Maxus  Вопросы ? 52 CS MSU Graphics & Media Lab (Video Group)