1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- #ifndef BOOST_ALGORITHM_HPP
- #define BOOST_ALGORITHM_HPP
- #include <boost/utility/enable_if.hpp> // for boost::disable_if
- #include <boost/type_traits/is_integral.hpp>
- namespace boost { namespace algorithm {
- template <typename T>
- T identity_operation ( std::multiplies<T> ) { return T(1); }
- template <typename T>
- T identity_operation ( std::plus<T> ) { return T(0); }
- template <typename T, typename Integer>
- typename boost::enable_if<boost::is_integral<Integer>, T>::type
- power (T x, Integer n) {
- T y = 1;
- if (n == 0) return y;
- while (true) {
- if (n % 2 == 1) {
- y = x * y;
- if (n == 1)
- return y;
- }
- n = n / 2;
- x = x * x;
- }
- return y;
- }
- template <typename T, typename Integer, typename Operation>
- typename boost::enable_if<boost::is_integral<Integer>, T>::type
- power (T x, Integer n, Operation op) {
- T y = identity_operation(op);
- if (n == 0) return y;
- while (true) {
- if (n % 2 == 1) {
- y = op(x, y);
- if (n == 1)
- return y;
- }
- n = n / 2;
- x = op(x, x);
- }
- return y;
- }
- }}
- #endif
|