Advertisement
zhangsongcui

LINQ (WIP)

Mar 5th, 2012
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.77 KB | None | 0 0
  1. // Compiled with g++ 4.7
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <iterator>
  5. #include <vector>
  6. #include <list>
  7. #include <functional>
  8.  
  9. namespace linq
  10. {
  11.     template <typename ContType>
  12.     class linq_impl {
  13.     public:
  14.         typedef typename ContType::value_type value_type;
  15.         typedef typename ContType::const_reference const_reference;
  16.     private:
  17.         typedef std::vector<typename ContType::iterator> inner_cont_type;
  18.         typedef typename inner_cont_type::const_reference inner_cref;
  19.  
  20.     public:
  21.         class iterator: std::iterator<std::random_access_iterator_tag, value_type> {
  22.             // TODO
  23.         };
  24.  
  25.     public:
  26.         linq_impl(ContType& cont): vec() {
  27.             this->vec.reserve(cont.size());
  28.             for (auto it = cont.begin(); it != cont.end(); ++it)
  29.                 vec.push_back(it);
  30.         }
  31.  
  32.         template <typename Func = std::less<value_type> >
  33.         linq_impl& orderby(Func func = Func()) {
  34.             std::sort(this->vec.begin(), this->vec.end(), [=] (inner_cref v1, inner_cref v2) {
  35.                 return func(*v1, *v2);
  36.             });
  37.             return *this;
  38.         }
  39.  
  40.         template <typename Func = std::greater<value_type> >
  41.         linq_impl& orderby_descending(Func func = Func()) {
  42.             return orderby(func);
  43.         }
  44.  
  45.         template <typename Func>
  46.         linq_impl& where(Func func) {
  47.             vec.erase(std::remove_if(this->vec.begin(), this->vec.end(), [=] (inner_cref val) {
  48.                 return !func(*val);
  49.             }), this->vec.end());
  50.             return *this;
  51.         }
  52.  
  53.     public:
  54.         std::vector<value_type> to_vector() {
  55.             // TODO: Use linq_impl::iterator to do this
  56.             std::vector<value_type> result;
  57.             result.reserve(this->vec.size());
  58.             for (auto it = this->vec.begin(); it != this->vec.end(); ++it)
  59.                 result.push_back(**it);
  60.             return result;
  61.         }
  62.  
  63.         std::list<value_type> to_list() {
  64.             // TODO: Use linq_impl::iterator to do this
  65.             std::list<value_type> result;
  66.             for (auto it = this->vec.begin(); it != this->vec.end(); ++it)
  67.                 result.push_back(**it);
  68.             return result;
  69.         }
  70.  
  71.     private:
  72.         inner_cont_type vec;
  73.     };
  74.  
  75.     template <typename ContType>
  76.     linq_impl<ContType> from(ContType& cont) {
  77.         return linq_impl<ContType>(cont);
  78.     }
  79. }
  80.  
  81. int main(int argc, char* argv[])
  82. {
  83.     using namespace std;
  84.     int arr[] = { 5, 2, 6, 2, 3, 1, 4 };
  85.     vector<int> vec(begin(arr), end(arr));
  86.     auto query = linq::from(vec)
  87.                       .where([] (int x) { return x % 2 == 0; })
  88.                       .orderby();
  89.     for (auto&& i : query.to_vector())
  90.         cout << i;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement