libpsynth 0.2.1
/home/raskolnikov/dev/psynth/trunk/src/psynth/sound/dynamic_buffer_range_factory.hpp
Go to the documentation of this file.
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 */