|
libpsynth 0.2.1
|
00001 00012 #ifndef PSYNTH_SOUND_DYNAMIC_BUFFER_RANGES_HPP 00013 #define PSYNTH_SOUND_DYNAMIC_BUFFER_RANGES_HPP 00014 00015 #include <psynth/sound/dynamic_buffer_range.hpp> 00016 #include <psynth/sound/buffer_range_factory.hpp> 00017 00018 namespace psynth 00019 { 00020 namespace sound 00021 { 00022 00023 namespace detail 00024 { 00025 00026 template <typename Result> 00027 struct flipped_range_fn 00028 { 00029 typedef Result result_type; 00030 template <typename Range> 00031 result_type operator() (const Range& src) const 00032 { 00033 return result_type (flipped_range (src)); 00034 } 00035 }; 00036 00037 template <typename Result> 00038 struct sub_range_fn 00039 { 00040 typedef Result result_type; 00041 sub_range_fn (std::ptrdiff_t start, std::ptrdiff_t size) 00042 : _start (start) 00043 , _size (size) {} 00044 00045 template <typename Range> 00046 result_type operator () (const Range& src) const 00047 { 00048 return result_type (sub_range (src, _start, _size)); 00049 } 00050 00051 std::ptrdiff_t _start, _size; 00052 }; 00053 00054 template <typename Result> 00055 struct sub_sampled_range_fn 00056 { 00057 typedef Result result_type; 00058 sub_sampled_range_fn (std::ptrdiff_t step) 00059 : _step (step) {} 00060 00061 template <typename Range> 00062 result_type operator () (const Range& src) const 00063 { 00064 return result_type (sub_sampled_range (src,_step)); 00065 } 00066 00067 std::ptrdiff_t _step; 00068 }; 00069 00070 template <typename Result> 00071 struct nth_sample_range_fn 00072 { 00073 typedef Result result_type; 00074 00075 nth_sample_range_fn(int n) 00076 : _n (n) {} 00077 00078 template <typename Range> 00079 result_type operator () (const Range& src) const 00080 { 00081 return result_type (nth_sample_range (src, _n)); 00082 } 00083 00084 int _n; 00085 }; 00086 00087 template <typename DstP, typename Result, 00088 typename CC = default_channel_converter> 00089 struct channel_converted_range_fn 00090 { 00091 typedef Result result_type; 00092 00093 channel_converted_range_fn (CC cc = CC()): 00094 _cc (cc) {} 00095 00096 template <typename Range> 00097 result_type operator () (const Range& src) const 00098 { 00099 return result_type (channel_converted_range<DstP> (src, _cc)); 00100 } 00101 00102 private: 00103 CC _cc; 00104 }; 00105 00106 00107 template <typename Result> 00108 struct flipped_fn 00109 { 00110 typedef Result result_type; 00111 template <typename Range> 00112 result_type operator() (const Range& src) const 00113 { 00114 return result_type (flipped_range (src)); 00115 } 00116 }; 00117 00118 } /* namespace detail */ 00119 00120 00124 template <typename RangeTypes> inline 00125 // Models MPL Random Access Container of models of BufferRangeConcept 00126 typename dynamic_step_type<dynamic_buffer_range<RangeTypes> >::type 00127 flipped_range (const dynamic_buffer_range<RangeTypes>& src) 00128 { 00129 return apply_operation ( 00130 src, detail::flipped_fn< 00131 typename dynamic_step_type< 00132 dynamic_buffer_range<RangeTypes> >::type>()); 00133 } 00134 00136 template <typename RangeTypes> inline 00137 // Models MPL Random Access Container of models of BufferRangeConcept 00138 dynamic_buffer_range <RangeTypes> 00139 sub_range (const dynamic_buffer_range<RangeTypes>& src, 00140 size_t start, size_t size) 00141 { 00142 return apply_operation (src, detail::sub_range_fn< 00143 dynamic_buffer_range<RangeTypes> >(start, size)); 00144 } 00145 00147 template <typename RangeTypes> inline 00148 // Models MPL Random Access Container of models of BufferRangeConcept 00149 typename dynamic_step_type<dynamic_buffer_range<RangeTypes> >::type 00150 sub_sampled_range (const dynamic_buffer_range<RangeTypes>& src, 00151 std::ptrdiff_t step) 00152 { 00153 return apply_operation ( 00154 src, detail::sub_sampled_range_fn< 00155 typename dynamic_step_type< 00156 dynamic_buffer_range<RangeTypes> >::type> (step)); 00157 } 00158 00159 namespace detail 00160 { 00161 00162 template <typename Range> 00163 struct get_nthsample_type 00164 { 00165 typedef typename nth_sample_range_type<Range>::type type; 00166 }; 00167 00168 template <typename Ranges> 00169 struct ranges_get_nthsample_type : public boost::mpl::transform< 00170 Ranges, get_nthsample_type<boost::mpl::_1> > {}; 00171 00172 } /* namespace detail */ 00173 00179 template <typename RangeTypes> 00180 struct nth_sample_range_type<dynamic_buffer_range<RangeTypes> > 00181 { 00182 typedef dynamic_buffer_range< 00183 typename detail::ranges_get_nthsample_type<RangeTypes>::type> type; 00184 }; 00185 00187 template <typename RangeTypes> inline 00188 // Models MPL Random Access Container of models of BufferRangeConcept 00189 typename nth_sample_range_type<dynamic_buffer_range<RangeTypes> >::type 00190 nth_sample_range (const dynamic_buffer_range<RangeTypes>& src, int n) 00191 { 00192 return apply_operation ( 00193 src, detail::nth_sample_range_fn< 00194 typename nth_sample_range_type< 00195 dynamic_buffer_range<RangeTypes> >::type>(n)); 00196 } 00197 00198 namespace detail 00199 { 00200 00201 template <typename Range, typename DstP, typename CC> 00202 struct get_ccv_type : public channel_converted_range_type<Range, DstP, CC> {}; 00203 00204 template <typename Ranges, typename DstP, typename CC> 00205 struct ranges_get_ccv_type : public boost::mpl::transform< 00206 Ranges, get_ccv_type<boost::mpl::_1, DstP, CC> > {}; 00207 00208 } /* namespace detail */ 00209 00216 template <typename RangeTypes, typename DstP, typename CC> 00217 struct channel_converted_range_type<dynamic_buffer_range<RangeTypes>,DstP,CC> 00218 { 00219 typedef dynamic_buffer_range< 00220 typename detail::ranges_get_ccv_type<RangeTypes, DstP, CC>::type> type; 00221 }; 00222 00228 template <typename DstP, typename RangeTypes, typename CC> inline 00229 // Models MPL Random Access Container of models of BufferRangeConcept 00230 typename channel_converted_range_type< 00231 dynamic_buffer_range<RangeTypes>, DstP, CC>::type 00232 channel_converted_range (const dynamic_buffer_range<RangeTypes>& src,CC cc) 00233 { 00234 return apply_operation ( 00235 src, detail::channel_converted_range_fn< 00236 DstP,typename channel_converted_range_type< 00237 dynamic_buffer_range<RangeTypes>, DstP, CC>::type >()); 00238 } 00239 00246 template <typename RangeTypes, typename DstP> 00247 struct channel_converted_range_type<dynamic_buffer_range<RangeTypes>,DstP> 00248 { 00249 typedef dynamic_buffer_range< 00250 typename detail::ranges_get_ccv_type< 00251 RangeTypes, DstP, default_channel_converter>::type> type; 00252 }; 00253 00259 template <typename DstP, typename RangeTypes> inline 00260 // Models MPL Random Access Container of models of BufferRangeConcept 00261 typename channel_converted_range_type<dynamic_buffer_range<RangeTypes>, DstP>::type 00262 channel_converted_range (const dynamic_buffer_range<RangeTypes>& src) 00263 { 00264 return apply_operation ( 00265 src, detail::channel_converted_range_fn < 00266 DstP,typename channel_converted_range_type< 00267 dynamic_buffer_range<RangeTypes>, DstP>::type >()); 00268 } 00269 00279 template <typename DstP, typename RangeTypes, typename CC> inline 00280 // Models MPL Random Access Container of models of BufferRangeConcept 00281 typename channel_converted_range_type< 00282 dynamic_buffer_range<RangeTypes>, DstP, CC>::type 00283 dynamic_channel_converted_range (const dynamic_buffer_range<RangeTypes>& src, CC cc) 00284 { 00285 return apply_operation ( 00286 src, detail::channel_converted_range_fn< 00287 DstP,typename channel_converted_range_type< 00288 dynamic_buffer_range<RangeTypes>, DstP, CC>::type >()); 00289 } 00290 00300 template <typename DstP, typename RangeTypes> inline 00301 // Models MPL Random Access Container of models of BufferRangeConcept 00302 typename channel_converted_range_type<dynamic_buffer_range<RangeTypes>, DstP>::type 00303 dynamic_channel_converted_range (const dynamic_buffer_range<RangeTypes>& src) 00304 { 00305 return apply_operation ( 00306 src, detail::channel_converted_range_fn< 00307 DstP, typename channel_converted_range_type< 00308 dynamic_buffer_range<RangeTypes>, DstP>::type >()); 00309 } 00310 00313 } /* namespace sound */ 00314 } /* namespace psynth */ 00315 00316 #endif /* PSYNTH_SOUND_DYNAMIC_BUFFER_RANGE_FACTORY */
1.7.4