Здравствуйте, VTT, Вы писали:
VTT>Нет конечно, в компайл-тайм только генерируется код метода, собирающего данные. VTT>т.е. в рантайм нет никаких SQL строчек, а просто вызывается метод, выполняющий заданный в компайл-тайм запрос со всеми оптимизациями.
Да, подобная мысль была. Например, грубо говоря убрать этап текстового SQL из связки приложение + SQLite, плюс генерировать код запроса во время компиляции.
Но, это имеет смысл только для сценариев типа встраиваемых СУБД а-ля SQLite.
Здравствуйте, niXman, Вы писали:
X>ща я тот код откопаю и гляну, как оно там планировалось...
ну понятно.
каждый тип на основе field_t хранит в себе хеш-сумму от имени колонки.
select() возвращает vector моих оберток поверх std::tuple, каждая из которых возвращает элемент тьюпла соответствующий хешь-сумме колонки.
EP> template <typename T>
EP> static auto &access(T &x)
EP> {
EP> return x.number;
EP> }
EP> // ... number function, number type, etc, etc
EP>};
EP>
Думаю, что лучше тогда уж сделать что-то вроде:
template<typename T> static auto member_ptr() { return &T::number; }
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[13]: [proof-of-concept] compile time query language
Здравствуйте, niXman, Вы писали:
X>>ща я тот код откопаю и гляну, как оно там планировалось... X>ну понятно. X>каждый тип на основе field_t хранит в себе хеш-сумму от имени колонки. X>select() возвращает vector моих оберток поверх std::tuple, каждая из которых возвращает элемент тьюпла соответствующий хешь-сумме колонки.
Непонятно зачем hash, когда можно индексировать непосредственно по полному строковому имени.
X>
EP>> struct field
EP>> {
EP>> T number;
EP>> };
EP>>
E>А смысл? Как предлагается это использовать?
В запросах к БД в SELECT указывается список полей которые должна содержать строка результирующего набора. Для удобства использования в коде нужно создавать структуру с аналогичным набором полей.
Смотри функцию handwritten из первого сообщения, в ней есть структура:
struct Row
{
double value;
int id;
int number;
} row;
vector_noinline<Row> xs;
Которая соответствует полям в SELECT: SELECT foo.value, foo.id, foo.number FROM foo WHERE foo.id>42
Трюк выше нужен для автогенерации такой структуры. Собственно он и используется в исходном сообщении:
for(auto &&x : to_vector(
from(foo)
.where(foo.id > 42_i)
.select(foo.value, foo.id, foo.number)
))
{
using namespace std;
cout << "ROW: " << x.id << " " << x.value << " " << x.number << endl;
// cout << x.code; // - compile error, because .code is not in projection
}
Здравствуйте, Erop, Вы писали:
E>А смысл? Как предлагается это использовать?
Или другой пример на тему reification<char...>:
Начиная с C++11 можно обрабатывать строки в compile-time.
Можно создать строковый DSL, который на основе текстового кода создаёт конкретные структуры у которых имена полей сгенерированны из этих строк.
Совсем абстрактный пример:
auto x = MAKE_STRUCT(" struct Test { int foo, double bar }; ");
x.foo = 1;
x.bar = .5;
Причём подобным образом можно генерировать не только поля, но и например методы и т.п.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Можно создать строковый DSL, который на основе текстового кода создаёт конкретные структуры у которых имена полей сгенерированны из этих строк.
почему-ьто мне кажется это невозможным... можно пример?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[14]: [proof-of-concept] compile time query language
Здравствуйте, niXman, Вы писали:
EP>>Можно создать строковый DSL, который на основе текстового кода создаёт конкретные структуры у которых имена полей сгенерированны из этих строк. X>почему-ьто мне кажется это невозможным... можно пример?
Для этого нужна фича std::reification которую я описал выше.
Ты же можешь обработать строку " struct Test { int foo, double bar }; " во время компиляции и вытащить от туда имена "foo" и "bar"? (пример
как это сделать)
Для этого даже есть готовый генератор парсеров — Boost.Metaparse.
Вытащив имена, ты можешь их скормить в std::reification<'f', 'o', 'o'>, где компилятор автоматом сгенерирует специализацию (в этом и есть мой proposal):
template<>
struct reification<'f', 'o', 'o'>
{
template <typename T>
struct field
{
T foo;
};
};
А далее, уже из этих специализаций можно слепить итоговую структуру через наследование, как в sqlpp11.
Здравствуйте, niXman, Вы писали:
X>я не понял одного: как имея строку, в компайл-тайме сгенерить переменную с именем, содержащимся в строке?
перечитал про reification.
и все равно не понял, как ты себе представляешь генерацию структуры в компайл-тайм, чтоб имена мемберов были те, что в строке... %)
т.е. ты действительно думаешь что такое реально сделать?:
auto x = MAKE_STRUCT("{int a; double b;}");
x.a = 3;
x.b = 3.14;
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[17]: [proof-of-concept] compile time query language
Здравствуйте, niXman, Вы писали:
X>и все равно не понял, как ты себе представляешь генерацию структуры в компайл-тайм, чтоб имена мемберов были те, что в строке... %)
Это будет делать компилятор, ему не трудно. Сейчас, в самом языке std::reification не реализуем.
X>т.е. ты действительно думаешь что такое реально сделать?: X>
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Не суть, вариантов много.
Что бы описать структуру с несколькими полями, предлагается выводиться из всех таких структур? Или какая идея?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[13]: [proof-of-concept] compile time query language
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Причём подобным образом можно генерировать не только поля, но и например методы и т.п.
Методам ещё теля нужны...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[14]: [proof-of-concept] compile time query language
Здравствуйте, Erop, Вы писали:
EP>>Не суть, вариантов много. E>Что бы описать структуру с несколькими полями, предлагается выводиться из всех таких структур? Или какая идея?
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Сейчас нет. Это я размышляю о предложении в ISO такой фичи (std::reification), которая позволит это реализовать.
https://dlang.org/mixin.html мощнее, почему не аналог его попросить у isocpp? Всё равно они сейчас включают всё подряд в стандарт
Re[19]: [proof-of-concept] compile time query language
Здравствуйте, flаt, Вы писали:
EP>>Сейчас нет. Это я размышляю о предложении в ISO такой фичи (std::reification), которая позволит это реализовать. F>https://dlang.org/mixin.html мощнее, почему не аналог его попросить у isocpp? Всё равно они сейчас включают всё подряд в стандарт
Подобное вряд ли включат (хотя я только за), это намного сложнее — std::reification генерирует простую специализацию, а не произвольный текстовый код (который ещё и возможно в свою очередь сгенерирует другой текстовый код).
Re[15]: [proof-of-concept] compile time query language
Здравствуйте, Evgeny.Panasyuk, Вы писали:
E>>Что бы описать структуру с несколькими полями, предлагается выводиться из всех таких структур? Или какая идея?
EP>Наследование от всех таких структур EP>
На самом деле, в С++ есть какой-то системный косяк уже давно с метапрограммированием.
Если уж развивать язык в эту сторону, то я бы лучше концепцию constexpr развивал. Всё равно у нас для реализации constexpr компилятор должен уметь исполнять CT с++ код без побочных эффектов, так что недалеко до того, что бы сделать так, что бы компилятор отдавал в макрос текст или АСТ или что-то вроде того, и получал наружу модифицированное тоже самое...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском