34 #ifndef CARTODATA_VOLUME_FUNCTIONAL_H
35 #define CARTODATA_VOLUME_FUNCTIONAL_H
47 namespace volumeutil {
67 template <
typename LEFT,
typename RIGHT>
70 #if __cplusplus >= 201100
71 typedef decltype( std::declval<LEFT>() + std::declval<RIGHT>() )
74 typedef typeof( LEFT() + RIGHT() ) result_type;
78 template <
typename LEFT,
typename RIGHT,
template<
typename>
class CONTAINER >
81 typedef CONTAINER<typename plus_result<LEFT,RIGHT>::result_type>
85 template <
typename LEFT,
typename RIGHT,
template<
typename>
class CONTAINER >
88 typedef CONTAINER<typename plus_result<LEFT,RIGHT>::result_type>
92 template <
typename LEFT,
typename RIGHT,
93 template<
typename>
class CONTAINER1,
94 template <
typename>
class CONTAINER2>
97 typedef CONTAINER1<typename plus_result<LEFT,RIGHT>::result_type>
103 template <
typename LEFT,
typename RIGHT>
106 #if __cplusplus >= 201100
107 typedef decltype( std::declval<LEFT>() - std::declval<RIGHT>() )
110 typedef typeof( LEFT() - RIGHT() ) result_type;
114 template <
typename LEFT,
typename RIGHT,
template<
typename>
class CONTAINER >
117 typedef CONTAINER<typename minus_result<LEFT,RIGHT>::result_type>
121 template <
typename LEFT,
typename RIGHT,
template<
typename>
class CONTAINER >
124 typedef CONTAINER<typename minus_result<LEFT,RIGHT>::result_type>
128 template <
typename LEFT,
typename RIGHT,
129 template<
typename>
class CONTAINER1,
130 template <
typename>
class CONTAINER2>
133 typedef CONTAINER1<typename minus_result<LEFT,RIGHT>::result_type>
139 template <
typename LEFT,
typename RIGHT>
142 #if __cplusplus >= 201100
143 typedef decltype( std::declval<LEFT>() * std::declval<RIGHT>() )
146 typedef typeof( LEFT() * RIGHT() ) result_type;
150 template <
typename LEFT,
typename RIGHT,
template<
typename>
class CONTAINER >
153 typedef CONTAINER<typename multiplies_result<LEFT,RIGHT>::result_type>
157 template <
typename LEFT,
typename RIGHT,
template<
typename>
class CONTAINER >
160 typedef CONTAINER<typename multiplies_result<LEFT,RIGHT>::result_type>
164 template <
typename LEFT,
typename RIGHT,
template<
typename>
class CONTAINER1,
template <
typename>
class CONTAINER2>
167 typedef CONTAINER1<typename multiplies_result<LEFT,RIGHT>::result_type>
173 template <
typename LEFT,
typename RIGHT>
176 #if __cplusplus >= 201100
177 typedef decltype( std::declval<LEFT>() / std::declval<RIGHT>() )
180 typedef typeof( LEFT() / RIGHT() ) result_type;
184 template <
typename LEFT,
typename RIGHT,
template<
typename>
class CONTAINER >
187 typedef CONTAINER<typename divides_result<LEFT,RIGHT>::result_type>
191 template <
typename LEFT,
typename RIGHT,
template<
typename>
class CONTAINER >
194 typedef CONTAINER<typename divides_result<LEFT,RIGHT>::result_type>
198 template <
typename LEFT,
typename RIGHT,
199 template<
typename>
class CONTAINER1,
200 template <
typename>
class CONTAINER2>
203 typedef CONTAINER1<typename divides_result<LEFT,RIGHT>::result_type>
209 template <
typename LEFT,
typename RIGHT>
212 #if __cplusplus >= 201100
213 typedef decltype( std::declval<LEFT>() % std::declval<RIGHT>() )
216 typedef typeof( LEFT() % RIGHT() ) result_type;
220 template <
typename LEFT,
typename RIGHT,
221 template<
typename>
class CONTAINER >
224 typedef CONTAINER<typename modulus_result<LEFT,RIGHT>::result_type>
228 template <
typename LEFT,
typename RIGHT,
229 template<
typename>
class CONTAINER >
232 typedef CONTAINER<typename modulus_result<LEFT,RIGHT>::result_type>
236 template <
typename LEFT,
typename RIGHT,
237 template<
typename>
class CONTAINER1,
238 template <
typename>
class CONTAINER2>
241 typedef CONTAINER1<typename modulus_result<LEFT,RIGHT>::result_type>
247 template <
typename LEFT,
typename RIGHT>
250 #if __cplusplus >= 201100
251 typedef decltype( std::declval<LEFT>() & std::declval<RIGHT>() )
254 typedef typeof( LEFT() & RIGHT() ) result_type;
258 template <
typename LEFT,
typename RIGHT,
template<
typename>
class CONTAINER >
261 typedef CONTAINER<typename bitwise_and_result<LEFT,RIGHT>::result_type>
265 template <
typename LEFT,
typename RIGHT,
template<
typename>
class CONTAINER >
268 typedef CONTAINER<typename bitwise_and_result<LEFT,RIGHT>::result_type>
272 template <
typename LEFT,
typename RIGHT,
273 template<
typename>
class CONTAINER1,
274 template <
typename>
class CONTAINER2>
277 typedef CONTAINER1<typename bitwise_and_result<LEFT,RIGHT>::result_type>
283 template <
typename LEFT,
typename RIGHT>
286 #if __cplusplus >= 201100
287 typedef decltype( std::declval<LEFT>() | std::declval<RIGHT>() )
290 typedef typeof( LEFT() | RIGHT() ) result_type;
294 template <
typename LEFT,
typename RIGHT,
template<
typename>
class CONTAINER >
297 typedef CONTAINER<typename bitwise_or_result<LEFT,RIGHT>::result_type>
301 template <
typename LEFT,
typename RIGHT,
template<
typename>
class CONTAINER >
304 typedef CONTAINER<typename bitwise_or_result<LEFT,RIGHT>::result_type>
308 template <
typename LEFT,
typename RIGHT,
309 template<
typename>
class CONTAINER1,
310 template <
typename>
class CONTAINER2>
313 typedef CONTAINER1<typename bitwise_or_result<LEFT,RIGHT>::result_type>
319 template <
typename LEFT,
typename RIGHT>
322 #if __cplusplus >= 201100
323 typedef decltype( std::declval<LEFT>() ^ std::declval<RIGHT>() )
326 typedef typeof( LEFT() ^ RIGHT() ) result_type;
330 template <
typename LEFT,
typename RIGHT,
template<
typename>
class CONTAINER >
333 typedef CONTAINER<typename bitwise_xor_result<LEFT,RIGHT>::result_type>
337 template <
typename LEFT,
typename RIGHT,
template<
typename>
class CONTAINER >
340 typedef CONTAINER<typename bitwise_xor_result<LEFT,RIGHT>::result_type>
344 template <
typename LEFT,
typename RIGHT,
345 template<
typename>
class CONTAINER1,
346 template <
typename>
class CONTAINER2>
349 typedef CONTAINER1<typename bitwise_xor_result<LEFT,RIGHT>::result_type>
355 template <
typename LEFT,
typename RIGHT>
358 #if __cplusplus >= 201100
359 typedef decltype(
true ? std::declval<LEFT>() : std::declval<RIGHT>() )
361 typedef typename std::remove_reference<ref_result_type>::type result_type;
363 typedef typeof(
true ? LEFT() : RIGHT() ) result_type;
367 template <
typename LEFT,
typename RIGHT,
template<
typename>
class CONTAINER >
370 typedef CONTAINER<typename select_result<LEFT,RIGHT>::result_type>
374 template <
typename LEFT,
typename RIGHT,
template<
typename>
class CONTAINER >
377 typedef CONTAINER<typename select_result<LEFT,RIGHT>::result_type>
381 template <
typename LEFT,
typename RIGHT,
382 template<
typename>
class CONTAINER1,
383 template <
typename>
class CONTAINER2>
386 typedef CONTAINER1<typename select_result<LEFT,RIGHT>::result_type>
396 template <
typename LEFT,
typename RIGHT>
764 template <
typename LEFT,
typename RIGHT = LEFT>
765 struct select_left:
public std::binary_function<LEFT, RIGHT, LEFT>
767 const LEFT &
operator() (
const LEFT & x,
const RIGHT & )
const
773 template <
typename LEFT,
typename RIGHT = LEFT>
776 const RIGHT &
operator() (
const LEFT & ,
const RIGHT & y )
const
782 template <
typename T>
791 template <
typename LEFT,
typename RIGHT = LEFT>
792 struct plus:
public std::binary_function<LEFT, RIGHT, typename plus_result<LEFT,RIGHT>::result_type>
801 template <
typename LEFT,
typename RIGHT = LEFT>
802 struct minus:
public std::binary_function<LEFT, RIGHT, typename minus_result<LEFT,RIGHT>::result_type>
811 template <
typename LEFT,
typename RIGHT = LEFT>
812 struct multiplies:
public std::binary_function<LEFT, RIGHT, typename multiplies_result<LEFT,RIGHT>::result_type>
821 template <
typename LEFT,
typename RIGHT = LEFT>
822 struct divides:
public std::binary_function<LEFT, RIGHT, typename divides_result<LEFT,RIGHT>::result_type>
831 template <
typename LEFT,
typename RIGHT = LEFT>
832 struct modulus:
public std::binary_function<LEFT, RIGHT, typename modulus_result<LEFT,RIGHT>::result_type>
841 template <
typename T>
842 struct negate:
public std::unary_function<T, T>
850 template <
typename T>
859 template <
typename T>
868 template <
typename LEFT,
typename RIGHT = LEFT>
869 struct equal_to:
public std::binary_function<LEFT, RIGHT, bool>
877 template <
typename LEFT,
typename RIGHT = LEFT>
886 template <
typename LEFT,
typename RIGHT = LEFT>
887 struct greater:
public std::binary_function<LEFT, RIGHT, bool>
895 template <
typename LEFT,
typename RIGHT = LEFT>
896 struct less:
public std::binary_function<LEFT, RIGHT, bool>
904 template <
typename LEFT,
typename RIGHT = LEFT>
913 template <
typename LEFT,
typename RIGHT = LEFT>
914 struct less_equal:
public std::binary_function<LEFT, RIGHT, bool>
922 template <
typename LEFT,
typename RIGHT = LEFT>
923 struct logical_and:
public std::binary_function<LEFT, RIGHT, bool>
931 template <
typename LEFT,
typename RIGHT = LEFT>
932 struct logical_or:
public std::binary_function<LEFT, RIGHT, bool>
940 template <
typename T>
949 template <
typename LEFT,
typename RIGHT = LEFT>
950 struct bitwise_and:
public std::binary_function<LEFT, RIGHT, typename bitwise_and_result<LEFT,RIGHT>::result_type>
959 template <
typename LEFT,
typename RIGHT = LEFT>
960 struct bitwise_or:
public std::binary_function<LEFT, RIGHT, typename bitwise_or_result<LEFT,RIGHT>::result_type>
969 template <
typename LEFT,
typename RIGHT = LEFT>
970 struct bitwise_xor:
public std::binary_function<LEFT, RIGHT, typename bitwise_xor_result<LEFT,RIGHT>::result_type>
979 template <
typename T>
988 template <
typename LEFT,
typename RIGHT = LEFT>
997 template <
typename LEFT,
typename RIGHT = LEFT>
1006 template <
typename LEFT,
typename RIGHT = LEFT>
1007 struct select_min:
public std::binary_function<LEFT, RIGHT, typename select_result<LEFT,RIGHT>::result_type>
1012 return ( x <= y ? x : y );
1016 template <
typename LEFT,
typename RIGHT = LEFT>
1017 struct select_max:
public std::binary_function<LEFT, RIGHT, typename select_result<LEFT,RIGHT>::result_type>
1022 return ( x >= y ? x : y );
1038 return x * (float)y;
1047 return x * (float)y;
1056 return x * (double)y;
1065 return x * (double)y;
1070 struct divides<
cfloat, double>:
public std::binary_function<cfloat, double, cfloat>
1074 return x * (float)( 1. / y );
1083 return x * (float)( 1. / (
double)y );
1092 return x * (double)( 1. / y );
1097 struct divides<
cdouble, double>:
public std::binary_function<cdouble, double, cdouble>
1101 return x * ( 1. / y );
1110 return x * (double)( 1. / (
double)y );
1119 return x && ( y.imag() || y.real() );
1128 return x && ( y.imag() || y.real() );
1137 return x || y.imag() || y.real();
1146 return x || y.imag() || y.real();
1155 return !( x.imag() || x.real() );
1164 return !( x.imag() || x.real() );
1173 struct increment<bool>:
public std::unary_function<bool, bool>
1182 struct decrement<bool>:
public std::unary_function<bool, bool>
1206 namespace volumeutil {
CONTAINER1< typename bitwise_and_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename bitwise_and_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename bitwise_and_result< LEFT, RIGHT >::result_type > result_type
typedef typeof(LEFT() &RIGHT()) result_type
bitwise_and_result< LEFT, RIGHT >::result_type operator()(const LEFT &x, const RIGHT &y) const
LEFT operator()(const LEFT &x, const RIGHT &y) const
T operator()(const T &x) const
CONTAINER1< typename bitwise_or_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename bitwise_or_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename bitwise_or_result< LEFT, RIGHT >::result_type > result_type
typedef typeof(LEFT()|RIGHT()) result_type
bitwise_or_result< LEFT, RIGHT >::result_type operator()(const LEFT &x, const RIGHT &y) const
LEFT operator()(const LEFT &x, const RIGHT &y) const
CONTAINER1< typename bitwise_xor_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename bitwise_xor_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename bitwise_xor_result< LEFT, RIGHT >::result_type > result_type
typedef typeof(LEFT() ^ RIGHT()) result_type
bitwise_xor_result< LEFT, RIGHT >::result_type operator()(const LEFT &x, const RIGHT &y) const
CONTAINER1< typename divides_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename divides_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename divides_result< LEFT, RIGHT >::result_type > result_type
typedef typeof(LEFT()/RIGHT()) result_type
divides_result< LEFT, RIGHT >::result_type operator()(const LEFT &x, const RIGHT &y) const
bool operator()(const LEFT &x, const RIGHT &y) const
bool operator()(const LEFT &x, const RIGHT &y) const
bool operator()(const LEFT &x, const RIGHT &y) const
const T & operator()(const T &x) const
bool operator()(const LEFT &x, const RIGHT &y) const
bool operator()(const LEFT &x, const RIGHT &y) const
bool operator()(const LEFT &x, const RIGHT &y) const
bool operator()(const T &x) const
bool operator()(const LEFT &x, const RIGHT &y) const
CONTAINER1< typename minus_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename minus_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename minus_result< LEFT, RIGHT >::result_type > result_type
typedef typeof(LEFT() - RIGHT()) result_type
minus_result< LEFT, RIGHT >::result_type operator()(const LEFT &x, const RIGHT &y) const
CONTAINER1< typename modulus_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename modulus_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename modulus_result< LEFT, RIGHT >::result_type > result_type
typedef typeof(LEFT() % RIGHT()) result_type
modulus_result< LEFT, RIGHT >::result_type operator()(const LEFT &x, const RIGHT &y) const
CONTAINER1< typename multiplies_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename multiplies_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename multiplies_result< LEFT, RIGHT >::result_type > result_type
typedef typeof(LEFT() *RIGHT()) result_type
multiplies_result< LEFT, RIGHT >::result_type operator()(const LEFT &x, const RIGHT &y) const
T operator()(const T &x) const
bool operator()(const LEFT &x, const RIGHT &y) const
CONTAINER1< typename plus_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename plus_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename plus_result< LEFT, RIGHT >::result_type > result_type
typedef typeof(LEFT()+RIGHT()) result_type
plus_result< LEFT, RIGHT >::result_type operator()(const LEFT &x, const RIGHT &y) const
const LEFT & operator()(const LEFT &x, const RIGHT &) const
select_result< LEFT, RIGHT >::result_type operator()(const LEFT &x, const RIGHT &y) const
select_result< LEFT, RIGHT >::result_type operator()(const LEFT &x, const RIGHT &y) const
CONTAINER1< typename select_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename select_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename select_result< LEFT, RIGHT >::result_type > result_type
typedef typeof(true ? LEFT() :RIGHT()) result_type
const RIGHT & operator()(const LEFT &, const RIGHT &y) const
std::complex< double > cdouble
std::complex< float > cfloat