/boolinq

Simplest C++ header-only LINQ template library

Primary LanguageC++MIT LicenseMIT

boolinq 3.0

CI Status Coverage Status

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

Wanna demo?

Example with integers

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

Example with structs

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"

Interesting example

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    

Containers supported?

  • C++: Native arrays, pairs of pointers
  • STL: list, stack, queue, vector, deque, set, map, any compatible ....
  • Qt: QList, QVector, QSet, QMap.

Operators supported?

Filters and reorders:

  • 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>()

Transformers:

  • select(transform), select_i(transform)
  • groupBy(transform)
  • selectMany(transfom)

Aggregators:

  • 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()

Bits and Bytes:

  • bytes<T>(ByteDirection?)
  • unbytes<T>(ByteDirection?)
  • bits(BitsDirection?, BytesDirection?)
  • unbits<T = unsigned char>(BitsDirection?, BytesDirection?)

Coming soon:

  • gz()
  • ungz()
  • leftJoin
  • rightJoin
  • crossJoin
  • fullJoin