Waveform
Waveform is a C++ header-only library which represents both the time and the frequency domains of a waveform/signal as a single object, transforming using FFTW automatically when needed.
 All Classes Namespaces Functions Typedefs Friends Groups
IdentityTransform.hpp
1 #ifndef IDENTITYTRANSFORM_HPP
2 #define IDENTITYTRANSFORM_HPP 1
3 #pragma once
4 
5 #include <typeinfo>
6 #include <iterator>
7 #include <functional>
8 #include <utility>
9 #include <boost/range.hpp>
10 
11 #include <boost/range/algorithm.hpp>
12 #include <boost/range/algorithm_ext.hpp>
13 
14 
15 
16 
17 
18 /*
19  For the Identity transform class, we don't care about the underlaying
20  type at all. Realistically, we only need to care about the two types
21  of iterators (or boost::range instances) so that the boost::copy function
22  can be called on those containers.
23 
24  The question becomes
25 
26 
27  */
28 
29 
30 
31 
32 
33 namespace Waveform {
34 
35 namespace Transform {
36 
37 
38 
39 //template <typename RandomAccessRange1, typename RandomAccessRange2>
40 template <typename Iterator1, typename Iterator2 = Iterator1>
41 //template <typename Container1, typename Container2 = Container1>
42 class Identity {
43  private:
44 
45  /*
46  typedef typename Container1::iterator Iterator1;
47  typedef typename Container2::iterator Iterator2;
48  */
49 
50  /*
51  typedef std::pair<Iterator1, Iterator1> RandomAccessRange1;
52  typedef std::pair<Iterator2, Iterator2> RandomAccessRange2;
53  */
54 
55  typedef boost::iterator_range<Iterator1> RandomAccessRange1;
56  typedef boost::iterator_range<Iterator2> RandomAccessRange2;
57 
58  private:
59 
60  public:
61 
62  typedef typename std::iterator_traits<Iterator1>::value_type input_type;
63  typedef typename std::iterator_traits<Iterator2>::value_type output_type;
64 
65  typedef std::function< output_type ( input_type ) > transform_type;
66 
67 
68  RandomAccessRange1 range1_;
69  RandomAccessRange2 range2_;
70 
71 
72 
73  public:
74 
75  /*
76  typedef typename RandomAccessRange1::iterator Iterator1;
77  typedef typename RandomAccessRange2::iterator Iterator2;
78  */
79 
80  //template <typename Iterator1, typename Iterator2>
81  Identity (Iterator1 first1, Iterator1 last1, Iterator2 first2)
82  : range1_ (std::make_pair(first1, last1))
83  , range2_ (std::make_pair(first2, first2 + boost::distance(range1_)))
84  {
85 
86  }
87 
88 
89  template <typename RandomAccessRangeIn1, typename RandomAccessRangeIn2>
90  Identity (RandomAccessRangeIn1& range1, RandomAccessRangeIn2& range2)
91  : range1_ (range1)
92  , range2_ (range2)
93  /*
94  : range1_ (boost::make_iterator_range(boost::begin(range1), boost::end(range1)))
95  , range2_ (boost::make_iterator_range(boost::begin(range2), boost::end(range2)))
96  */
97  //: range1_ (boost::begin(range1), boost::end(range1))
98  //, range2_ (boost::begin(range2), boost::end(range2))
99  {
100 
101  }
102 
103 
104  ~Identity (void)
105  {
106 
107  }
108 
109  void
110  exec_transform(void)
111  {
112  boost::copy(range1_, boost::begin(range2_));
113  }
114 
115  void
116  exec_inverse_transform(void)
117  {
118  boost::copy(range2_, boost::begin(range1_));
119  }
120 
121 };
122 
123 
124 
125 } // namespace Transform
126 } // namespace Waveform
127 
128 
129 #endif