00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "config.hpp"
00014
00015 #if !defined(ARAGELI_INCLUDE_CPP_WITH_EXPORT_TEMPLATE) || \
00016 defined(ARAGELI_INCLUDE_CPP_WITH_EXPORT_TEMPLATE_POWEREST)
00017
00018 #include "powerest.hpp"
00019
00020
00021 namespace Arageli
00022 {
00023
00024
00025 template <typename T, typename I, typename T_factory>
00026 T power (T a, I n, const T_factory& tfctr)
00027 {
00028 ARAGELI_ASSERT_0(!is_null(a) || is_positive(n));
00029
00030 T res = tfctr.unit(a);
00031 while(!is_null(n))
00032 {
00033 if(is_odd(n))res = res * a;
00034 a *= a;
00035 n >>= 1;
00036 }
00037
00038 return res;
00039 }
00040
00041
00042 }
00043
00044 #endif
00045