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>
785 const T & operator() (
const T & x )
const 791 template <
typename LEFT,
typename RIGHT = LEFT>
792 struct plus:
public std::binary_function<LEFT, RIGHT, typename plus_result<LEFT,RIGHT>::result_type>
795 operator() (
const LEFT & x,
const RIGHT & y)
const 801 template <
typename LEFT,
typename RIGHT = LEFT>
802 struct minus:
public std::binary_function<LEFT, RIGHT, typename minus_result<LEFT,RIGHT>::result_type>
805 operator() (
const LEFT & x,
const RIGHT & y)
const 811 template <
typename LEFT,
typename RIGHT = LEFT>
812 struct multiplies:
public std::binary_function<LEFT, RIGHT, typename multiplies_result<LEFT,RIGHT>::result_type>
815 operator() (
const LEFT & x,
const RIGHT & y)
const 821 template <
typename LEFT,
typename RIGHT = LEFT>
822 struct divides:
public std::binary_function<LEFT, RIGHT, typename divides_result<LEFT,RIGHT>::result_type>
825 operator() (
const LEFT & x,
const RIGHT & y)
const 831 template <
typename LEFT,
typename RIGHT = LEFT>
832 struct modulus:
public std::binary_function<LEFT, RIGHT, typename modulus_result<LEFT,RIGHT>::result_type>
835 operator() (
const LEFT & x,
const RIGHT & y)
const 841 template <
typename T>
842 struct negate:
public std::unary_function<T, T>
844 T operator() (
const T & x)
const 850 template <
typename T>
853 T operator() (T x)
const 859 template <
typename T>
862 T operator() (T x)
const 868 template <
typename LEFT,
typename RIGHT = LEFT>
869 struct equal_to:
public std::binary_function<LEFT, RIGHT, bool>
871 bool operator() (
const LEFT & x,
const RIGHT & y)
const 877 template <
typename LEFT,
typename RIGHT = LEFT>
880 bool operator() (
const LEFT & x,
const RIGHT & y)
const 886 template <
typename LEFT,
typename RIGHT = LEFT>
887 struct greater:
public std::binary_function<LEFT, RIGHT, bool>
889 bool operator() (
const LEFT & x,
const RIGHT & y)
const 895 template <
typename LEFT,
typename RIGHT = LEFT>
896 struct less:
public std::binary_function<LEFT, RIGHT, bool>
898 bool operator() (
const LEFT & x,
const RIGHT & y)
const 904 template <
typename LEFT,
typename RIGHT = LEFT>
907 bool operator() (
const LEFT & x,
const RIGHT & y)
const 913 template <
typename LEFT,
typename RIGHT = LEFT>
914 struct less_equal:
public std::binary_function<LEFT, RIGHT, bool>
916 bool operator() (
const LEFT & x,
const RIGHT & y)
const 922 template <
typename LEFT,
typename RIGHT = LEFT>
923 struct logical_and:
public std::binary_function<LEFT, RIGHT, bool>
925 bool operator() (
const LEFT & x,
const RIGHT & y)
const 931 template <
typename LEFT,
typename RIGHT = LEFT>
932 struct logical_or:
public std::binary_function<LEFT, RIGHT, bool>
934 bool operator() (
const LEFT & x,
const RIGHT & y)
const 940 template <
typename T>
943 bool operator() (
const T & x)
const 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>
953 operator() (
const LEFT & x,
const RIGHT & y)
const 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>
963 operator() (
const LEFT & x,
const RIGHT & y)
const 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>
973 operator() (
const LEFT & x,
const RIGHT & y)
const 979 template <
typename T>
982 T operator() (
const T & x)
const 988 template <
typename LEFT,
typename RIGHT = LEFT>
991 LEFT operator() (
const LEFT & x,
const RIGHT & y)
const 997 template <
typename LEFT,
typename RIGHT = LEFT>
1000 LEFT operator() (
const LEFT & x,
const RIGHT & y)
const 1006 template <
typename LEFT,
typename RIGHT = LEFT>
1007 struct select_min:
public std::binary_function<LEFT, RIGHT, typename select_result<LEFT,RIGHT>::result_type>
1010 operator() (
const LEFT & x,
const RIGHT & y)
const 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>
1020 operator() (
const LEFT & x,
const RIGHT & y)
const 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 );
1117 bool operator() (
const bool & x,
const cfloat & y)
const 1119 return x && ( y.imag() || y.real() );
1126 bool operator() (
const bool & x,
const cdouble & y)
const 1128 return x && ( y.imag() || y.real() );
1135 bool operator() (
const bool & x,
const cfloat & y)
const 1137 return x || y.imag() || y.real();
1144 bool operator() (
const bool & x,
const cdouble & y)
const 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>
1175 bool operator() (
bool )
1182 struct decrement<bool>:
public std::unary_function<bool, bool>
1184 bool operator() (
bool )
1206 namespace volumeutil {
1238 #endif // CARTODATA_VOLUME_FUNCTIONAL_H
CONTAINER< typename bitwise_and_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename bitwise_xor_result< LEFT, RIGHT >::result_type > result_type
CONTAINER1< typename minus_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename modulus_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename multiplies_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename modulus_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename minus_result< LEFT, RIGHT >::result_type > result_type
CONTAINER1< typename bitwise_and_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename minus_result< LEFT, RIGHT >::result_type > result_type
CONTAINER1< typename bitwise_or_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename select_result< LEFT, RIGHT >::result_type > result_type
std::complex< float > cfloat
CONTAINER< typename bitwise_or_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename divides_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename bitwise_or_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename divides_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename bitwise_and_result< LEFT, RIGHT >::result_type > result_type
CONTAINER1< typename multiplies_result< LEFT, RIGHT >::result_type > result_type
typedef typeof(LEFT()+RIGHT()) result_type
CONTAINER< typename multiplies_result< LEFT, RIGHT >::result_type > result_type
CONTAINER1< typename bitwise_xor_result< LEFT, RIGHT >::result_type > result_type
CONTAINER1< typename plus_result< LEFT, RIGHT >::result_type > result_type
CONTAINER1< typename select_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename select_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename plus_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename bitwise_xor_result< LEFT, RIGHT >::result_type > result_type
CONTAINER< typename plus_result< LEFT, RIGHT >::result_type > result_type
std::complex< double > cdouble
CONTAINER1< typename modulus_result< LEFT, RIGHT >::result_type > result_type
CONTAINER1< typename divides_result< LEFT, RIGHT >::result_type > result_type