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