remove \r
[extl.git] / extl / mpl / math / pow.h
blob5f32698f64ef4be2453134be8a86f01f1aa93fa7
1 /* ///////////////////////////////////////////////////////////////////////
2 * File: pow.h
4 * Created: 08.03.17
5 * Updated: 08.05.09
7 * Brief: Caculate R = P^N
9 * [<Home>]
10 * Copyright (c) 2008-2020, Waruqi All rights reserved.
11 * //////////////////////////////////////////////////////////////////// */
12 #ifndef EXTL_MPL_MATH_POW_H
13 #define EXTL_MPL_MATH_POW_H
15 /*!\file pow.h
16 * \brief Caculate R = P^N
18 * Note: range from 0 to 62(64-bit) or 30(32-bit)
20 #ifndef EXTL_MPL_MATH_POW_SUPPORT
21 # error extl::pow is not supported by current compiler.
22 #endif
23 /* ///////////////////////////////////////////////////////////////////////
24 * Includes
26 #include "math.h"
27 #include "../int_.h"
29 #ifdef EXTL_MPL_IF_SUPPORT
30 # include "../if_.h"
31 #endif
33 /* ///////////////////////////////////////////////////////////////////////
34 * ::extl::mpl namespace
36 EXTL_MPL_BEGIN_WHOLE_NAMESPACE
38 /* ///////////////////////////////////////////////////////////////////////
39 * Compatibility
41 #ifdef EXTL_MPL_SUPPORT
42 #ifdef EXTL_MPL_IF_SUPPORT
44 /* //////////////////////////////////////////////////////////////////// */
45 EXTL_DETAIL_BEGIN_NAMESPACE /* ::extl::mpl::detail namespace */
46 /* //////////////////////////////////////////////////////////////////// */
47 template < e_umax_int_t P, e_umax_int_t N, e_umax_int_t R >
48 struct pow_impl
50 /* In order to decrease the number of instaniation and do not need partial specialization */
51 typedef typename_type_k if_< (N > 0)
52 , pow_impl< P, N - 1, P * R >
53 , umax_int_<R>
54 >::type result_t;
56 EXTL_STATIC_MEMBER_CONST(e_umax_int_t, value = result_t::value);
58 /* The number of instaniation is very much and needs partial specialization */
59 /* EXTL_STATIC_MEMBER_CONST(e_umax_int_t, value = ((N > 0)? (pow_impl< P, N-1, P * R >::value)) : R); */
62 /* VECTORC: need partial specialization */
63 # if defined(EXTL_COMPILER_IS_VECTORC) && \
64 defined(EXTL_TEMPLATE_PARTIAL_SPEC_SUPPORT)
65 template < e_umax_int_t P, e_umax_int_t R >
66 struct pow_impl<P, 0, R>
68 EXTL_STATIC_MEMBER_CONST(e_umax_int_t, value = R);
70 # endif
71 /* //////////////////////////////////////////////////////////////////// */
72 EXTL_DETAIL_END_NAMESPACE /* ::extl::mpl::detail namespace */
73 /* //////////////////////////////////////////////////////////////////// */
74 /*!\brief: pow class
76 * \ingroup extl_group_mpl
78 template < e_umax_int_t P, e_umax_int_t N >
79 struct pow
80 : EXTL_NS_DETAIL(pow_impl)< P, N, 1 >
83 /*!\brief: pow_2 class
85 * \ingroup extl_group_mpl
87 template < e_umax_int_t N >
88 struct pow_2
89 : EXTL_NS_DETAIL(pow_impl)< 2, N, 1 >
92 /*!\brief: pow_10 class
94 * \ingroup extl_group_mpl
96 template < e_umax_int_t N >
97 struct pow_10
98 : EXTL_NS_DETAIL(pow_impl)< 10, N, 1 >
101 /* ///////////////////////////////////////////////////////////////////////
102 * Unit testing
104 #ifdef EXTL_MPL_MATH_POW_TEST_ENABLE
105 # include "unit_test/pow_test.h"
106 #endif
108 /* //////////////////////////////////////////////////////////////////// */
109 #endif /* EXTL_MPL_IF_SUPPORT */
110 #endif /* EXTL_MPL_SUPPORT */
111 /* //////////////////////////////////////////////////////////////////// */
113 /* ///////////////////////////////////////////////////////////////////////
114 * ::extl::mpl namespace
116 EXTL_MPL_END_WHOLE_NAMESPACE
118 /* //////////////////////////////////////////////////////////////////// */
119 #endif /* EXTL_MPL_MATH_POW_H */
120 /* //////////////////////////////////////////////////////////////////// */