derived.hpp
Go to the documentation of this file.
1 #ifndef CRYPTO3_DERIVED_HPP
2 #define CRYPTO3_DERIVED_HPP
3 
4 #include <boost/range/adaptor/argument_fwd.hpp>
5 #include <boost/range/detail/default_constructible_unary_fn.hpp>
6 #include <boost/range/iterator_range.hpp>
7 #include <boost/range/concepts.hpp>
8 
9 #include <boost/iterator/transform_iterator.hpp>
10 
11 #include <boost/utility/result_of.hpp>
12 
13 namespace nil {
14  namespace crypto3 {
15  namespace detail {
16  // A type generator to produce the transform_iterator type conditionally
17  // including a wrapped predicate as appropriate.
18  template<typename P, typename It>
19  struct transform_iterator_gen {
20  typedef boost::transform_iterator<typename boost::range_detail::default_constructible_unary_fn_gen<
21  P,
22  typename boost::transform_iterator<P, It>::reference>::type,
23  It>
25  };
26 
27  template<class F, class R>
29  : public boost::iterator_range<
30  typename transform_iterator_gen<F, typename boost::range_iterator<R>::type>::type> {
31  private:
32  typedef
34 
35  typedef boost::iterator_range<transform_iter_t> base;
36 
37  public:
38  typedef typename boost::range_detail::default_constructible_unary_fn_gen<
39  F,
40  typename boost::transform_iterator<F, typename boost::range_iterator<R>::type>::reference>::type
42 
43  typedef R source_range_type;
44 
46  base(transform_iter_t(boost::begin(r), f), transform_iter_t(boost::end(r), f)) {
47  }
48  };
49 
50  template<class T>
51  struct encode_holder : boost::range_detail::holder<T> {
52  encode_holder(T r) : boost::range_detail::holder<T>(r) {
53  }
54  };
55 
56  template<class SinglePassRange, class UnaryFunction>
59  BOOST_RANGE_CONCEPT_ASSERT((boost::SinglePassRangeConcept<SinglePassRange>));
60 
62  }
63 
64  template<class SinglePassRange, class UnaryFunction>
66  operator|(const SinglePassRange &r, const encode_holder<UnaryFunction> &f) {
67  BOOST_RANGE_CONCEPT_ASSERT((boost::SinglePassRangeConcept<const SinglePassRange>));
68 
70  }
71 
72  } // namespace detail
73 
74  using detail::derived_range;
75 
76  namespace adaptors {
77  namespace {
78  const range_detail::forwarder<detail::encode_holder> derived =
79  detail::forwarder<detail::encode_holder>();
80  }
81 
82  template<class UnaryFunction, class SinglePassRange>
83  inline derived_range<UnaryFunction, SinglePassRange> transform(SinglePassRange &rng, UnaryFunction fn) {
84  BOOST_RANGE_CONCEPT_ASSERT((boost::SinglePassRangeConcept<SinglePassRange>));
85 
87  }
88 
89  template<class UnaryFunction, class SinglePassRange>
91  UnaryFunction fn) {
92  BOOST_RANGE_CONCEPT_ASSERT((boost::SinglePassRangeConcept<const SinglePassRange>));
93 
95  }
96  } // namespace adaptors
97  } // namespace crypto3
98 } // namespace nil
99 
100 #endif // CRYPTO3_DERIVED_HPP
encoded_range< UnaryFunction, SinglePassRange > transform(SinglePassRange &rng, UnaryFunction fn)
Definition: encrypted.hpp:105
encoded_range< UnaryFunction, SinglePassRange > operator|(SinglePassRange &r, const encode_holder< UnaryFunction > &f)
Definition: encrypted.hpp:79
Definition: pair.hpp:31
Definition: derived.hpp:30
derived_range(transform_fn_type f, R &r)
Definition: derived.hpp:45
R source_range_type
Definition: derived.hpp:43
boost::range_detail::default_constructible_unary_fn_gen< F, typename boost::transform_iterator< F, typename boost::range_iterator< R >::type >::reference >::type transform_fn_type
Definition: derived.hpp:41
Definition: encrypted.hpp:73
encode_holder(T r)
Definition: derived.hpp:52
boost::transform_iterator< typename boost::range_detail::default_constructible_unary_fn_gen< P, typename boost::transform_iterator< P, It >::reference >::type, It > type
Definition: encrypted.hpp:46