Super tiny C++11 single-file header-only LINQ template library
Just imagine .NET Framework LINQ support for STL/Qt collections :)
Get source code here: boolinq.h
int src[] = {1,2,3,4,5,6,7,8};
auto dst = from(src).where( [](int a) { return a % 2 == 1; }) // 1,3,5,7
.select([](int a) { return a * 2; }) // 2,6,10,14
.where( [](int a) { return a > 2 && a < 12; }) // 6,10
.toStdVector();
// dst type: std::vector<int>
// dst items: 6,10
struct Man {
std::string name;
int age;
};
Man src[] = {
{"Kevin",14},
{"Anton",18},
{"Agata",17},
{"Terra",20},
{"Layer",15},
};
auto dst = from(src).where( [](const Man & man) { return man.age < 18; })
.orderBy([](const Man & man) { return man.age; })
.select( [](const Man & man) { return man.name; })
.toStdVector();
// dst type: std::vector<std::string>
// dst items: "Kevin", "Layer", "Agata"
struct Message {
std::string PhoneA;
std::string PhoneB;
std::string Text;
};
Message messages[] = {
{"Anton","Troll","Hello, friend!"},
{"Denis","Wride","OLOLO"},
{"Anton","Papay","WTF?"},
{"Denis","Maloy","How r u?"},
{"Denis","Wride","Param-pareram!"},
};
int DenisUniqueContactCount =
from(messages).where( [](const Message & msg) { return msg.PhoneA == "Denis"; })
.distinct([](const Message & msg) { return msg.PhoneB; })
.count();
// DenisUniqueContactCount == 2
- C++: Native arrays, pairs of pointers
- STL: list, stack, queue, vector, deque, set, map, any compatible ....
- Qt: QList, QVector, QSet, QMap.
where(predicate)
,where_i(predicate)
take(count)
,takeWhile(predicate)
,takeWhile_i(predicate)
skip(count)
,skipWhile(predicate)
,skipWhile_i(predicate)
orderBy()
,orderBy(transform)
distinct()
,distinct(transform)
append(items)
,prepend(items)
concat(linq)
reverse()
cast<T>()
select(transform)
,select_i(transform)
groupBy(transform)
selectMany(transfom)
all()
,all(predicate)
any()
,any(lambda)
sum()
,sum<T>()
,sum(lambda)
avg()
,avg<T>()
,avg(lambda)
min()
,min(lambda)
max()
,max(lambda)
count()
,count(value)
,count(predicate)
contains(value)
elementAt(index)
first()
,first(filter)
,firstOrDefault()
,firstOrDefault(filter)
last()
,last(filter)
,lastOrDefault()
,lastOrDefault(filter)
toStdSet()
,toStdList()
,toStdDeque()
,toStdVector()
bytes<T>(ByteDirection?)
unbytes<T>(ByteDirection?)
bits(BitsDirection?, BytesDirection?)
unbits<T = unsigned char>(BitsDirection?, BytesDirection?)
- gz()
- ungz()
- leftJoin
- rightJoin
- crossJoin
- fullJoin