Re: [boost] C# LINQ-like library: Boost.Qlang.

Hi, I read you mail on boost concerning QLang. I just wanted to say I was wondering (not very seriously) how to do such system, and you come with a very clean first try.
Basically it's done with some metaprogramming to get the exact return type of a query. For example, if I put as an argument in a select a pointer to member data, I extract that pointer to member's type and put it in a tuple, without const, volatile and removing the reference. I also use filter_iterator and transform_iterator from boost to filter sequences based on the where lambda. Just a suggestion : it would be great if the user of the qlang could select
a tuple of value as a return value. (let's say I want to select the string member "_name", a copy of the pointeur "this", and an int "_age" for example from a set of objects. I suppose returning a tuple for example (or some other type than those of the members) could be very interesting.
I don't know very well what you mean by returning a tuple of value as a return value. For now, what the libraries does is, if you write: from(somerange).select(full_object); it will return a select_ object which will generate a copy of the full object. if you write: from(somerange).select(&MyStruct::a_, &MyStruct::b_); it will return a select_ object which will return a std::tuple<type of a_ without const and without reference, type of b_ without const and without reference>. Boost.Qlang allows you to return tuples right now, the problem is that those tuples (for now) are just 1-element tuples. But in the future they will be arbitrary tuples. A copy of the this pointer does not make sense I think. Since every piece of data is immutable (data is always generated based on the select arguments), if you want the this pointer, you will have to return full_object (a copy). So you cannot get the this pointer directly. You can manipulate that query and write it back where it belongs if you want to modify some object.

2009/10/18 Germán Diago <germandiago@gmail.com>
Hi, I read you mail on boost concerning QLang. I just wanted to say I was wondering (not very seriously) how to do such system, and you come with a very clean first try.
Basically it's done with some metaprogramming to get the exact return type of a query. For example, if I put as an argument in a select a pointer to member data, I extract that pointer to member's type and put it in a tuple, without const, volatile and removing the reference. I also use filter_iterator and transform_iterator from boost to filter sequences based on the where lambda. Thanks for the "clean first try". Anyway, it must improve quite a bit before being a serious candidate for boost. Just now it just works with c++0x, which I think is a serious problem for
inclusion.
.
Just a suggestion : it would be great if the user of the qlang could
select a tuple of value as a return value. (let's say I want to select the string member "_name", a copy of the pointeur "this", and an int "_age" for example from a set of objects. I suppose returning a tuple for example (or some other type than those of the members) could be very interesting.
I don't know very well what you mean by returning a tuple of value as a return value. For now, what the libraries does is, if you write:
from(somerange).select(full_object);
it will return a select_ object which will generate a copy of the full object.
if you write:
from(somerange).select(&MyStruct::a_, &MyStruct::b_);
it will return a select_ object which will return a std::tuple<type of a_ without const and without reference, type of b_ without const and without reference>.
Boost.Qlang allows you to return tuples right now, the problem is that those tuples (for now) are just 1-element tuples. But in the future they will be arbitrary tuples. A copy of the this pointer does not make sense I think. Since every piece of data is immutable (data is always generated based on the select arguments), if you want the this pointer, you will have to return full_object (a copy). So you cannot get the this pointer directly. You can manipulate that query and write it back where it belongs if you want to modify some object.

From: Germán Diago <germandiago@gmail.com> Hi,
I read you mail on boost concerning QLang. I just wanted to say I was wondering (not very seriously) how to do such system, and you come with a very clean first try.
Basically it's done with some metaprogramming to get the exact return type of a query. For example, if I put as an argument in a select a pointer to member data, I extract that pointer to member's type and put it in a tuple, without const, volatile and removing the reference. I also use filter_iterator and transform_iterator from boost to filter sequences based on the where lambda. Thanks for the "clean first try". Anyway, it must improve quite a bit before being a serious candidate for boost. Just now it just works with c++0x, which I think is a serious problem for inclusion. Just a suggestion : it would be great if the user of the qlang could select
a tuple of value as a return value. (let's say I want to select the string member "_name", a copy of the pointeur "this", and an int "_age" for example from a set of objects. I suppose returning a tuple for example (or some other type than those of the members) could be very interesting.
I don't know very well what you mean by returning a tuple of value as a return value. For now, what the libraries does is, if you write: from(somerange).select(full_object); it will return a select_ object which will generate a copy of the full object. if you write: from(somerange).select(&MyStruct::a_, &MyStruct::b_); it will return a select_ object which will return a std::tuple<type of a_ without const and without reference, type of b_ without const and without reference>. Boost.Qlang allows you to return tuples right now, the problem is that those tuples (for now) are just 1-element tuples. But in the future they will be arbitrary tuples. A copy of the this pointer does not make sense I think. Since every piece of data is immutable (data is always generated based on the select arguments), if you want the this pointer, you will have to return full_object (a copy). So you cannot get the this pointer directly. You can manipulate that query and write it back where it belongs if you want to modify some object.
participants (1)
-
Germán Diago