Рассказ о проектировании и реализации драйвера PostgreSQL с человеческим интерфейсом с применением почти всех доступных на данный момент языковых средств C++17. Когда мы работаем с БД, мы зачастую получаем сырые буферы, в то время как хочется получать данные в виде структур, классов и контейнеров C++. Рассказ о проектировании и реализации драйвера PostgreSQL с человеческим интерфейсом с применением почти всех доступных на данный момент языковых средств C++17. Описанный в докладе подход можно адаптировать практически к любому протоколу уровня приложений.
В докладе будут сделаны попытки ответить на вопросы, какой тип скрывается под маской auto, почему T&& не всегда rvalue, и почему move ничего не двигает.
Рассмотрены известные автору подходы к реализации как lock-free, так и fine-grained lock-based set/map: хеш-таблицы, деревья. Что из подходов STL может быть реализовано в lock-free манере, а что принципиально нет. Подводные камни lock-free и их нейтрализация.
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
Обобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
Доклад посвящён различным аспектам компилятора С++, созданного с участием автора. В выступлении рассказывается о продвинутой архитектуре компилятора, основных проектных решениях, а также обсуждаются особенности входного языка, повлиявшие на реализацию компилятора.
В лекции подробно рассмотрены тонкие моменты языка JavaScript, с которыми часто возникают основные проблемы. Наглядные примеры и рецепты помогают лучше понять его особенности.
В докладе будут сделаны попытки ответить на вопросы, какой тип скрывается под маской auto, почему T&& не всегда rvalue, и почему move ничего не двигает.
Рассмотрены известные автору подходы к реализации как lock-free, так и fine-grained lock-based set/map: хеш-таблицы, деревья. Что из подходов STL может быть реализовано в lock-free манере, а что принципиально нет. Подводные камни lock-free и их нейтрализация.
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
Обобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
Доклад посвящён различным аспектам компилятора С++, созданного с участием автора. В выступлении рассказывается о продвинутой архитектуре компилятора, основных проектных решениях, а также обсуждаются особенности входного языка, повлиявшие на реализацию компилятора.
В лекции подробно рассмотрены тонкие моменты языка JavaScript, с которыми часто возникают основные проблемы. Наглядные примеры и рецепты помогают лучше понять его особенности.
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
В докладе перед нами откроется великолепный мир велосипедов и устаревших технологий, которые люди продолжают переносить в новые проекты и повсеместно использовать. Мы поговорим о:
Copy-On-Write
разработке без оглядки на готовые решения и к чему это приводит
force inline
оптимизациях, которые отлично себя показывают на бенчмарках и плохо себя ведут в реальной жизни
бездумно отключаемых оптимизациях компилятора
тонкостях стандартной библиотеки для повседневного использования
супер качественном велосипедостроении
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Yandex
Алексей Куканов, Intel.
Последняя версия стандарта С++ добавляет в язык и библиотеку поддержки средства для использования потоков исполнения (threads) и синхронизации между ними. Однако это лишь необходимая низкоуровневая база для внедрения параллелизма. Эффективная разработка параллельных программ требует высокоуровневого API, реализующего типичные шаблоны использования параллелизма в виде, пригодном для применения в широком спектре алгоритмов и приложений. В докладе речь пойдёт о наиболее часто встречающихся параллельных шаблонах, реализованных в программных моделях Intel® Threading Building Blocks и Intel® Cilk Plus, и о примерах их использования.
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
Описываются возможности C++ по работе с наследованием (virtual, override, final). Описываются механизмы работы с константными переменными и методами (const, mutable, constexpr). Описываются возможности по перегрузке операторов (operator).
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
В своем докладе Олег расскажет о замене стандартных функций на более быстрые и об ускорении работы python. Также продемонстрирует несколько примеров быстрых конструкций python.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Roman Orlov
В докладе будут затронуты принципиальные вопросы — зачем нам программировать на шаблонах, как мы это делаем в C++11/14 и как будем это делать в C++17. Проведем параллель с функциональными языками (привет Haskell!). На примере реального кода разберем fold-expressions и увидим, чем опасен constexpr-if. А также взглянем на метапрограммирование в стиле C++11/14 и C++17 глазами компилятора.
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
В докладе перед нами откроется великолепный мир велосипедов и устаревших технологий, которые люди продолжают переносить в новые проекты и повсеместно использовать. Мы поговорим о:
Copy-On-Write
разработке без оглядки на готовые решения и к чему это приводит
force inline
оптимизациях, которые отлично себя показывают на бенчмарках и плохо себя ведут в реальной жизни
бездумно отключаемых оптимизациях компилятора
тонкостях стандартной библиотеки для повседневного использования
супер качественном велосипедостроении
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Yandex
Алексей Куканов, Intel.
Последняя версия стандарта С++ добавляет в язык и библиотеку поддержки средства для использования потоков исполнения (threads) и синхронизации между ними. Однако это лишь необходимая низкоуровневая база для внедрения параллелизма. Эффективная разработка параллельных программ требует высокоуровневого API, реализующего типичные шаблоны использования параллелизма в виде, пригодном для применения в широком спектре алгоритмов и приложений. В докладе речь пойдёт о наиболее часто встречающихся параллельных шаблонах, реализованных в программных моделях Intel® Threading Building Blocks и Intel® Cilk Plus, и о примерах их использования.
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
Описываются возможности C++ по работе с наследованием (virtual, override, final). Описываются механизмы работы с константными переменными и методами (const, mutable, constexpr). Описываются возможности по перегрузке операторов (operator).
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
В своем докладе Олег расскажет о замене стандартных функций на более быстрые и об ускорении работы python. Также продемонстрирует несколько примеров быстрых конструкций python.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Roman Orlov
В докладе будут затронуты принципиальные вопросы — зачем нам программировать на шаблонах, как мы это делаем в C++11/14 и как будем это делать в C++17. Проведем параллель с функциональными языками (привет Haskell!). На примере реального кода разберем fold-expressions и увидим, чем опасен constexpr-if. А также взглянем на метапрограммирование в стиле C++11/14 и C++17 глазами компилятора.
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
Основываясь на опыте разработки Крипты, Дмитрий рассмотрит средства реализации статического и динамического полиморфизма в C++, а также некоторые их паттерны и антипаттерны.
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
ЛЕКЦИЯ 5. Многопоточное программирование в языке С++. Работа с потоками. Защита данных. Синхронизация. Будущие результаты
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
http://techtalks.nsu.ru
Видеозапись: http://www.youtube.com/watch?v=v7uBLSm6ft8
06 октября 2015. Как приручить дракона: введение в LLVM (Дмитрий Кашицын, HDsoft)
«В этом докладе мы кратко расскажем о таком звере, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.»
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
10 июня 2015. Дмитрий Кашицын (HDsoft) дает обзор LLVM.
http://techtalks.nsu.ru
Видеозапись: https://plus.google.com/events/ctes98f7uhf19t5jlvlbk24dan4
В этом докладе мы кратко расскажем о таком звере, как LLVM, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
Догнать и перегнать boost::lexical_castRoman Orlov
Разбор нестандартной реализации преобразования целого числа в строку без использования циклов и рекурсивных вызовов времени исполнения - только рекурсия на этапе компиляции
Мы уже около 3-х лет используем HandlerSocket в нашей инфраструктуре сайта badoo.com. За это время мы накопили опыт решения характерных для Handlersocket проблем, появляющихся при использовании.
Несколько команд внутри Баду активно используют HS для решения разноплановых задач мобильных и настольных приложений Баду. Где-то мы используем HS как замену Memcached, где-то как простой поисковый механизм, где-то как хранилище типа ключ-значение. Наш HS-кластер содержит более 30 серверов, обрабатывая порядка 8000 запросов/сек.
Я также предоставлю написанный мной код библиотеки-клиента для Handlersocket на PHP.
Про что доклад:
* что это вообще такое;
* чем является HS и чем не является;
* внутреннее устройство и работа HS;
* протокол;
* примеры использования в Баду, с цифрами и графиками;
* особенности: шардирование, Percona Server, постоянные соединения (бенефиты, проблемы и их решения), tips & tricks;
полезные сслыки, ответы на FAQ.
Доклад рассчитан на highload-разработчиков, работающих с реляционными БД.
Сложность: выше среднего.
Нас окружает мир сетей, мобильных устройств, сайтов, облаков. Чтобы работать с этим миром, придумано невероятное количество технологий и языков программирования. Есть ли среди них место для языков Си/Си++? Стоит ли тратить время на их изучение, стоит ли использовать их в своих проектах? Не пора ли этим языкам на пенсию? Эти темы в своем докладе обсудит Андрей Карпов, активно участвующий в жизни сообщества Си++-программистов. Забегая вперед можно утверждать - языки Си/Си++ живее всех живых. Андрей расскажет о развитии языка и новых возможностях, появившихся в Си++11. Многие возможности существенно облегчают работу программиста и сокращают объем кода.
Python&Printer / Андрей Пучко / penta.byPython Meetup
Андрей рассказал о личном опыте сражений за печать отчетов из программ на Python. Речь шла о полезных инструментах и форматах документов (PDF, RTF, DOCX, XLS, ODT, HTML) которые можно готовить к печати при помощи Python.
Лекция 4. Строки, байты, файлы и ввод/вывод.Roman Brovko
Строковые литералы и сырые строки. Строки и Юникод. Основные методы работы со строками. Модуль string. Байты. Кодировки. Файлы и файловые объекты. Методы работы с файлами. Модуль io
Хранимые процедуры в NoSQL СУБД на примере Tarantool / Денис Линник (Mail.Ru)Ontico
HighLoad++ 2017
Зал «Найроби + Касабланка», 8 ноября, 11:00
Тезисы:
http://www.highload.ru/2017/abstracts/2950.html
Одним из приемов, позволяющих увеличить скорость обработки и получения данных, является написание хранимых процедур. В этом докладе будут рассмотрены преимущества и недостатки такого подхода на примере Tarantool.
Tarantool можно рассматривать как полноценный application server. При таком подходе к разработке приложения, запущенные на Tarantool, можно рассматривать как микросервисы.
...
Дмитрий Прокопцев, Яндекс
Речь пойдёт о, наверное, одном из самых важных и в то же время сложных нововведений в С++11 — R-ссылках (rvalue references). Мы рассмотрим базовые правила работы с такими ссылками и связанные с ними новые концепции языка: перемещение классов, универсальные ссылки и перенаправление вызовов.
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...corehard_by
Использование сторонних библиотек в языке C++ никогда не было простым - необходимо было правильно собрать их, имея дело с различными системами сборки, но с появлением пакетного менеджера conan.io процесс стал намного проще, так что теперь осталось только сделать пакеты для нужным библиотек, и в этом поможет команда bincrafter-ов.
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотниковcorehard_by
На предыдущих конференциях C++ CoreHard автор доклада рассказывал про Модель Акторов и опыт ее использования в C++. Но Модель Акторов -- это далеко не единственный способ борьбы со сложностью при работе с многопоточностью. Давайте попробуем поговорить о том, что еще можно применить и как это может выглядеть в C++.
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титовcorehard_by
Если вам важна скорость работы ваших программ, то вы обязаны понимать, как работает ваше "железо". Современный процессор -- это сложное устройство, многие механизмы которого могут неочевидным образом влиять на скорость исполнения вашего кода. В докладе дается обзорное представление основных структур современного процессора и подробно рассматривается работа иерархии памяти. Будут освещены следующие темы: организация кэш-памяти, принцип локальности, предподкачка данных, нежелательное общее владение данными, а также программные техники для эффективной работы с памятью.
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...corehard_by
Информационная безопасность все больше из отдельной сферы плавно перетекает в разработку ПО. А значит «обычным» программистам приходится понимать те требования и терминологию, которые специалисты по безопасности уже давно знают и используют. CWE, CERT, MISRA, SAST– для «обычных» программистов это непонятные аббревиатуры. Поэтому в обзорном докладе мы попробуем рассказать простым языком об этих понятиях так, чтобы все разработчики начали уверенно ориентироваться в этой теме.
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишковcorehard_by
Вот уже более двух лет мы создаём онлайн-специализацию по С++ на платформе Coursera. Её цель — обучить языку C++ с нуля до уровня, достаточного для решения практических задач, с которыми приходилось сталкиваться авторам в своей практике. В своём докладе я расскажу, как мы создаём наши онлайн-курсы, и уделю особое внимание техническим проблемам, которые нам пришлось решить в процессе создания автоматической системы проверки программ студентов.
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...corehard_by
В докладе обсуждаются способы улучшения времени сборки C++ проектов, опыт полученный в ходе ускорения сборки клиента и тулов World Of Tanks. Также описывается эффект, который они оказывают на организацию кодобазы (как позитивный, так и негативный) и затраты, которые необходимы для поддержки этих решений, т.к. не все они бесплатны. Методики, описываемые в докладе: ускорение линковки (Incremental Linking, Fastlink), ускорение компиляции(Include what you use, использование precompiled headers).
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...corehard_by
Доклад посвящён вопросам реализации пропозала Герба Саттера PR0707 (метаклассы в С++) за пределами компилятор - в виде отдельной утилиты. Будет продемонстрированы варианты использования метаклассов в реальной жизни, затронуты вопросы их реализации на базе Clang Frontend, а также возможные перспективы развития технологии и методики.
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...corehard_by
Все мы знаем, что компиляторы в настоящее время достаточно умные. И нам как программистам зачастую не нужно думать о каких-то незначительных оптимизациях - мы полагаемся на оптимизации компилятора. Что ж, настало время выяснить, действительно ли настолько компиляторы умны и узнать, в каких местах программист всё же (может быть) умнее.
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...corehard_by
В докладе будет рассмотрена генерация кода при компиляции различных языковых конструкций, как простых, так и сложных, на различных платформах, как общераспространённых x86/x64, так и тех, которым уделяется меньше внимания: ARM, AVR. Также будут встречаться примеры для совсем экзотических процессоров вроде PowerPC и даже MicroBlaze. Основной упор будет делаться не на обработку данных, а именно на сопоставление различных конструкций кода с инструкциями целевых платформ.
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...corehard_by
What do threads, atomic variables, mutexes, and conditional variables have in common? They are the basic building blocks of any concurrent application in C++, which are even for the experienced C++ programmers a big challenge. This massively changed with C++17 and change even more with C++20/23. What did we get with C++17, what can we hope for with C++20/23? With C++17, most of the standard template library algorithms are available in sequential, parallel, and vectorised variants. With the upcoming standards, we can look forward to executors, transactional memory, significantly improved futures and coroutines. To make it short. These are just the highlights from the concurrent and parallel perspective. Thus there is the hope that in the future C++ abstractions such as executors, transactional memory, futures and coroutines are used and that threads, atomic variables, mutexes and condition variables are just implementation details.
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...corehard_by
Язык C++, претерпев долгую эволюцию, обрёл ряд черт, характерных для функциональной парадигмы: функции стали полноправными объектами, над которыми могут выполняться операции, а аппарат шаблонов позволяет проводить вычисления на типах на этапе компиляции. Математический фундамент этих двух главных аспектов составляют, соответственно, ламбда-исчисление и теория категорий. Расширение языка этими средствами способствовало реализации на языке C++ ряда инструментов, известных из функционального программирования. Некоторые из этих реализаций вошли в стандартную библиотеку (std::function, std::bind), другие - в сторонние библиотеки, в том числе в коллекцию библиотек Boost (functional, hana). Важную роль в арсенале функционального программирования играют операции свёртки и развёртки, которые очевиднее всего определяются для списков, но также естественным образом обобщаются на другие индуктивные и коиндуктивные структуры данных. Например, суммирование списка чисел можно представить себе как свёртку списка по операции сложения, а построение списка простых множителей заданного целого числа - как развёртку. Обобщения свёртки и развёртки известны как анаморфизмы и катаморфизмы. Также в функциональном программировании находит применение понятие гиломорфизма - композиция развёртки некоторого объекта в коллекцию с последующей свёрткой её в новый объект. В докладе продемонстрировано, что свёртки, развёртки и их композиции допускают довольно простую реализацию на языке C++.
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филоновcorehard_by
Доклад посвящен часто используемому шаблону в моих проектах по анализу данных, когда обучение и настройка моделей происходят с использованием python, а вот их запуск в промышленное использование на языке C++. Предлагается рассмотреть несколько учебных примеров реализации такого подхода, от простой линейной регрессии до обработки изображений с помощью нейронных сетей.
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukićcorehard_by
This talk will be about the design and implementation of a reactive programming model inspired by ranges that allows easy implementation of asynchronous and distributed software systems by writing code that looks like a sequence of ordinary range transformations like filter, transform, etc. This programming model will be demonstrated along with the implementation of a simple asynchronous web service where the whole system logic is defined as a chain of range transformations.
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakovacorehard_by
The document discusses how an IDE can help debug tricky C++ code without running it by leveraging tools to understand macros, types, templates, and overloads. It describes how an IDE could show the step-by-step substitution of macros, substitute typedefs one step at a time, debug template instantiations and constant expressions, explain overload resolution, and profile includes to optimize header usage. The presenter argues that tools are needed to make powerful C++ abstractions more accessible.
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_by
В C++11 добавили новое ключевое слово - constexpr. Выглядит оно весьма невзрачно, да и на первый взгляд кажется, что смысла в нём маловато... Для чего же оно нужно, какие у него есть тайные супер способности и какую роль оно сыграет в дальнейшем развитии языка C++ - обо всём об этом мы и поговорим.
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...corehard_by
This document discusses range-based text formatting and proposes replacing existing approaches with a range-based solution. It suggests representing text as ranges and using range algorithms and functions for concatenation and formatting. This would allow treating different string types uniformly and flexibly while avoiding issues with current formatting methods like iostream manipulation and format strings. The document provides examples of formatting numbers and dates as ranges and constructing containers like std::string from multiple ranges.
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019corehard_by
Память в компьютере - это не только гигабайты оперативной памяти в слоте, но и занятная абстракция. В докладе мы рассмотрим, как можно эту абстракцию использовать необычным образом для моделирования других абстракций - регистровых файлов периферийных устройств. Доклад будет полезен не только embedded-разработчикам, но и, возможно, заставит переосмыслить свой взгляд на память.
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019corehard_by
Как правило, можно положиться на то, что компилятор оптимизирует результирующий бинарный файл так, чтобы она работала максимально быстро. Но компилятор не знает на каких данных и на каком железе программа будет запущена. Плюс хотелось бы, чтобы компиляция занимала приемлемое время. Из-за этого результат может оказаться субоптимальным. Предлагаю на примерах для LLVM посмотреть как можно подсказать компилятору как оптимизировать программу и сделать результат лучше или хуже.
Мы напишем простейший веб-сервис из клиента и сервера на C++. На этом C++ часть закончится, и пойдет настройка окружения и инфраструктуры. Мы обеспечим детерминируемость сборки и прогона тестов. Облегчим последующее обновление зависимых библиотек. Автоматизируем статические проверки, верификацию кода, прогон тестов. Обеспечим доступность сервиса, настроим инфраструктуру, сбалансируем нагрузку, добавим автоматическое и ручное масштабирование. И под конец мы настроим continious delivery таким образом, что код будет на продакшене через 5 минут после реквеста, при этом даже невалидные изменения и ошибки программиста не смогут повлиять на его работу.
2. Шаблоны C++ и базы данных
Сергей Федоров, ведущий разработчик
!2
3. План доклада или о чём вот это всё
00 ⎮ Зачем писать свой драйвер?
10 ⎮ Чтение и запись буферов полей
20 ⎮ Работа с записями БД
30 ⎮ Работа с набором данных
40 ⎮ Как это поможет мне?
50 ⎮ Вопросы и ответы
05 ⎮ API с «человеческим» лицом
!3
4. Что потрогаем
00 ⎮ Первичный шаблон без определения
10 ⎮ SFINAE для специализаций шаблонов
20 ⎮ Variadic templates
30 ⎮ Fold expressions
40 ⎮ Constexpr функции
50 ⎮ If constexpr
!4
10. Исполнение запросов
auto trx = cluster.Begin({});
trx.Execute("insert into foobar (foo, bar) values ($1, $2)", 42, "baz");
trx.Commit();
!9
11. Работа с результатами запроса
auto trx = cluster.Begin();
auto res = trx.Execute("select foo, bar from foobar where foo = $1", 42);
for (auto row : res) {
// process row
for (auto field : row) {
// process field
}
}
trx.Commit();
!10
12. Работа с результатами запроса
auto trx = cluster.Begin();
auto res = trx.Execute("select foo, bar from foobar where foo = $1", 42);
for (auto row : res) {
// process row
auto foo = row[0].As<int>();
auto bar = row[1].As<std::string>();
}
trx.Commit();
!11
13. Работа с результатами запроса
auto trx = cluster.Begin();
auto res = trx.Execute("select foo, bar from foobar where foo = $1", 42);
for (auto row : res) {
// process row
auto [foo, bar] = row.As<int, std::string>();
}
trx.Commit();
!12
14. Работа с результатами запроса
https://www.ietf.org/rfc/rfc3092.txt
struct FooBar { int foo; std::string bar; }; // RFC 3092
auto trx = cluster.Begin();
auto res = trx.Execute("select foo, bar from foobar where foo = $1", 42);
for (auto row : res) {
// process row
auto foobar = row.As<FooBar>();
}
trx.Commit();
!13
15. Работа с результатами запроса
struct FooBar { int foo; std::string bar; }; // RFC 3092
auto trx = cluster.Begin();
auto res = trx.Execute("select foo, bar from foobar where foo = $1", 42);
auto foobars = res.AsContainer<std::vector<FooBar>>();
trx.Commit();
!14
17. Чтение и запись буферов отдельных
полей
10
fold expression и запись
Замена tag switching на if constexpr
Определение наличия специализации
SFINAE для специализаций
!16
25. Чтение полей в переменные
!24
auto trx = cluster.Begin({});
auto res = trx.Execute("select foo, bar from foobar where foo >= $1", 42);
for (auto row : res) {
auto foo = row[0].As<int>();
auto bar = row[1].As<std::string>();
}
trx.Commit();
26. Чтение полей в переменные
!25
auto trx = cluster.Begin({});
auto res = trx.Execute("select foo, bar from foobar where foo >= $1", 42);
for (auto row : res) {
int foo;
std::string bar;
row[0].To(foo);
row[1].To(bar);
}
trx.Commit();
27. /// Read the field's buffer into user-provided variable.
/// @throws FieldValueIsNull If the field is null and the C++ type is
/// not nullable.
template <typename T>
void Field::To(T&& val) const {
using ValueType = typename std::decay<T>::type;
auto fb = GetBuffer();
if (fb.is_null) {
if constexpr (io::traits::kIsNullable<ValueType>) {
using NullSetter = io::traits::GetSetNull<ValueType>;
NullSetter::SetNull(val);
} else {
throw FieldValueIsNull{field_index_};
}
} else {
Read(fb, std::forward<T>(val));
}
}
Чтение буфера поля записи
!26
28. Чтение буфера поля записи
template <typename T>
void Field::Read(const io::FieldBuffer& buffer, T&& val) const {
using ValueType = typename std::decay<T>::type;
static_assert(io::traits::kHasAnyParser<ValueType>,
"Type doesn't have any parsers defined");
if (buffer.format == io::DataFormat::kTextDataFormat) {
ReadText(buffer, std::forward<T>(val));
} else {
ReadBinary(buffer, std::forward<T>(val));
}
}
!27
29. Чтение буфера поля записи
template <typename T>
void Field::ReadBinary(const io::FieldBuffer& buffer, T&& val) const {
using ValueType = typename std::decay<T>::type;
if constexpr (io::traits::kHasBinaryParser<ValueType>) {
io::ReadBinary(buffer, std::forward<T>(val));
} else {
throw NoValueParser{::utils::GetTypeName<T>(),
io::DataFormat::kBinaryDataFormat};
}
}
!28
30. template <typename T>
void ReadBinary(const FieldBuffer& buffer, T&& value) {
using ValueType = std::decay_t<T>;
static_assert( traits::kHasBinaryParser<ValueType>,
"Type doesn't have a binary parser");
ReadBuffer<DataFormat::kBinaryDataFormat>(buffer, std::forward<T>(value));
}
template <DataFormat F, typename T>
void ReadBuffer(const FieldBuffer& buffer, T&& value) {
using ValueType = std::decay_t<T>;
static_assert((traits::kHasParser<ValueType, F>),
"Type doesn't have an appropriate parser");
using BufferReader = typename traits::IO<ValueType, F>::ParserType;
BufferReader{std::forward<T>(value)}(buffer);
}
Чтение буфера поля записи
!29
48. template <typename T>
void Row::To(T&& val, RowTag) const {
using ValueType = std::decay_t<T>;
static_assert(io::traits::kIsRowType<ValueType>,
"This type cannot be used as a row type");
using RowType = io::RowType<ValueType>;
using TupleType = typename RowType::TupleType;
detail::TupleDataExtractor<TupleType>::ExtractTuple(
*this, RowType::GetTuple(std::forward<T>(val)));
}
Так откуда же tuple?
!47
54. И чтобы совсем красиво
struct FooBar { int foo; std::string bar; }; // RFC 3092
auto trx = cluster.Begin();
auto res = trx.Execute("select foo, bar from foobar where foo = $1", 42);
auto foobars = res.AsContainer<std::vector<FooBar>>();
trx.Commit();
!53
55. Особый шаг
template <typename Container>
Container ResultSet::AsContainer() const {
using ValueType = typename Container::value_type;
Container c;
if constexpr (io::traits::kCanReserve<Container>) {
c.reserve(Size());
}
auto res = AsSetOf<ValueType>();
std::copy(res.begin(), res.end(), io::traits::Inserter(c));
return c;
}
!54
57. Рецепты
Tag switching
Variadic recursion
Система парсеров
Вычислить параметр шаблона
Особое действие для типа
Наличие специализации
if constexpr
fold expression
Система «свойств» типов
Первичный шаблон без специализации
Свойство и if constexpr
Магия
!56