1 /* ///////////////////////////////////////////////////////////////////////
7 * Brief: Caculate R = P^N
10 * Copyright (c) 2008-2020, Waruqi All rights reserved.
11 * //////////////////////////////////////////////////////////////////// */
12 #ifndef EXTL_MPL_MATH_POW_H
13 #define EXTL_MPL_MATH_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.
23 /* ///////////////////////////////////////////////////////////////////////
29 #ifdef EXTL_MPL_IF_SUPPORT
33 /* ///////////////////////////////////////////////////////////////////////
34 * ::extl::mpl namespace
36 EXTL_MPL_BEGIN_WHOLE_NAMESPACE
38 /* ///////////////////////////////////////////////////////////////////////
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
>
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
>
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
);
71 /* //////////////////////////////////////////////////////////////////// */
72 EXTL_DETAIL_END_NAMESPACE
/* ::extl::mpl::detail namespace */
73 /* //////////////////////////////////////////////////////////////////// */
76 * \ingroup extl_group_mpl
78 template < e_umax_int_t P
, e_umax_int_t N
>
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
>
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
>
98 : EXTL_NS_DETAIL(pow_impl
)< 10, N
, 1 >
101 /* ///////////////////////////////////////////////////////////////////////
104 #ifdef EXTL_MPL_MATH_POW_TEST_ENABLE
105 # include "unit_test/pow_test.h"
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 /* //////////////////////////////////////////////////////////////////// */