fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <list>
  4. #include <cstring>
  5. #include <set>
  6.  
  7. #include <boost/iterator/filter_iterator.hpp>
  8. #include <boost/iterator/transform_iterator.hpp>
  9. #include <boost/iterator/zip_iterator.hpp>
  10. #include <boost/tuple/tuple.hpp>
  11. #include <algorithm>
  12. #include <memory>
  13.  
  14. template<typename IterT>
  15. class iterator_stream {
  16. private:
  17. IterT begin_, end_;
  18.  
  19. public:
  20. iterator_stream(IterT begin, IterT end) : begin_(std::move(begin)), end_(std::move(end)) { }
  21.  
  22. IterT begin() const {
  23. return begin_;
  24. }
  25.  
  26. IterT end() const {
  27. return end_;
  28. }
  29.  
  30. template<typename CallbackT> void
  31. for_each(CallbackT cb) {
  32. std::for_each(begin_, end_, cb);
  33. }
  34.  
  35. template<typename PredicateT>
  36. iterator_stream<boost::filter_iterator<PredicateT, IterT>> filter(PredicateT predicate) {
  37. typedef boost::filter_iterator<PredicateT, IterT> FilterIterT;
  38. return iterator_stream<FilterIterT>(FilterIterT(predicate, begin_, end_), FilterIterT(predicate, end_, end_));
  39. }
  40.  
  41. template<typename MapperT>
  42. iterator_stream<boost::transform_iterator<MapperT, IterT>> map(MapperT mapper) {
  43. typedef boost::transform_iterator<MapperT, IterT> MapIterT;
  44. return iterator_stream<MapIterT>(MapIterT(begin_, mapper), MapIterT(end_, mapper));
  45. }
  46.  
  47. };
  48.  
  49. template<typename ContainerT>
  50. auto stream(ContainerT& c) -> iterator_stream<typename ContainerT::iterator> {
  51. return iterator_stream<typename ContainerT::iterator>(c.begin(), c.end());
  52. }
  53.  
  54. template<typename T, std::size_t Size>
  55. iterator_stream<T*> stream(T (&a)[Size]) {
  56. return iterator_stream<T*>(a, a + Size);
  57. }
  58.  
  59. template<typename Iter1T, typename Iter2T>
  60. iterator_stream<boost::zip_iterator<boost::tuple<Iter1T, Iter2T>>> zip(iterator_stream<Iter1T> const& s1, iterator_stream<Iter2T> const& s2) {
  61. typedef boost::zip_iterator<boost::tuple<Iter1T, Iter2T>> ZipIterT;
  62. return iterator_stream<ZipIterT>(
  63. ZipIterT(boost::make_tuple(s1.begin(), s2.begin())),
  64. ZipIterT(boost::make_tuple(s1.end(), s2.end())));
  65. }
  66.  
  67. int main() {
  68. std::vector<char const*> vec = { "Hello", "World", "!"};
  69. stream(vec)
  70. .filter([](auto& str) { return std::strlen(str) > 1; })
  71. .map([](auto& str) { return std::strlen(str); })
  72. .for_each([](auto len) { std::cout << len << std::endl; });
  73.  
  74. std::list<std::string> en = { "Hello", "World", "Asshole" };
  75. char const* de[] = { "Hallo", "Welt", "Arschloch" };
  76. std::set<std::string> insults = { "Asshole" };
  77. zip(stream(en), stream(de))
  78. .filter([&] (auto const& t) { return insults.find(boost::get<0>(t)) == insults.end(); })
  79. .map([](auto const& t) { return boost::get<0>(t) + " - " + boost::get<1>(t); })
  80. .for_each([] (auto const& str) { std::cout << str << std::endl; });
  81. }
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
5
5
Hello - Hallo
World - Welt