]> AND Private Git Repository - canny.git/blob - stc/exp/ml_stc_linux_make_v1.0/include/boost/mpl/vector/aux_/at.hpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
f836f17f2743a7bb3b790173b296f055c7d6d211
[canny.git] / stc / exp / ml_stc_linux_make_v1.0 / include / boost / mpl / vector / aux_ / at.hpp
1 \r
2 #ifndef BOOST_MPL_VECTOR_AUX_AT_HPP_INCLUDED\r
3 #define BOOST_MPL_VECTOR_AUX_AT_HPP_INCLUDED\r
4 \r
5 // Copyright Aleksey Gurtovoy 2000-2004\r
6 //\r
7 // Distributed under the Boost Software License, Version 1.0. \r
8 // (See accompanying file LICENSE_1_0.txt or copy at \r
9 // http://www.boost.org/LICENSE_1_0.txt)\r
10 //\r
11 // See http://www.boost.org/libs/mpl for documentation.\r
12 \r
13 // $Id: at.hpp 49267 2008-10-11 06:19:02Z agurtovoy $\r
14 // $Date: 2008-10-11 02:19:02 -0400 (Sat, 11 Oct 2008) $\r
15 // $Revision: 49267 $\r
16 \r
17 #include <boost/mpl/at_fwd.hpp>\r
18 #include <boost/mpl/vector/aux_/tag.hpp>\r
19 #include <boost/mpl/long.hpp>\r
20 #include <boost/mpl/void.hpp>\r
21 #include <boost/mpl/aux_/nttp_decl.hpp>\r
22 #include <boost/mpl/aux_/type_wrapper.hpp>\r
23 #include <boost/mpl/aux_/value_wknd.hpp>\r
24 #include <boost/mpl/aux_/config/typeof.hpp>\r
25 #include <boost/mpl/aux_/config/ctps.hpp>\r
26 \r
27 namespace boost { namespace mpl {\r
28 \r
29 #if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)\r
30 \r
31 template< typename Vector, long n_ >\r
32 struct v_at_impl\r
33 {\r
34     typedef long_< (Vector::lower_bound_::value + n_) > index_;\r
35     typedef __typeof__( Vector::item_(index_()) ) type;\r
36 };\r
37 \r
38 \r
39 template< typename Vector, long n_ >\r
40 struct v_at\r
41     : aux::wrapped_type< typename v_at_impl<Vector,n_>::type >\r
42 {\r
43 };\r
44 \r
45 template<>\r
46 struct at_impl< aux::vector_tag >\r
47 {\r
48     template< typename Vector, typename N > struct apply\r
49         : v_at<\r
50               Vector\r
51             , BOOST_MPL_AUX_VALUE_WKND(N)::value\r
52             >\r
53     {\r
54     };\r
55 };\r
56 \r
57 #else\r
58 \r
59 #   if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \\r
60     && !defined(BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC)\r
61 \r
62 template< typename Vector, BOOST_MPL_AUX_NTTP_DECL(long, n_) > struct v_at;\r
63 \r
64 template< BOOST_MPL_AUX_NTTP_DECL(long, n_) >\r
65 struct at_impl< aux::vector_tag<n_> >\r
66 {\r
67     template< typename Vector, typename N > struct apply\r
68 #if !defined(__BORLANDC__)\r
69         : v_at<\r
70               Vector\r
71             , BOOST_MPL_AUX_VALUE_WKND(N)::value\r
72             >\r
73     {\r
74 #else\r
75     {\r
76         typedef typename v_at<\r
77               Vector\r
78             , BOOST_MPL_AUX_VALUE_WKND(N)::value\r
79             >::type type;\r
80 #endif\r
81     };\r
82 };\r
83 \r
84 #   else\r
85 \r
86 namespace aux {\r
87 \r
88 template< BOOST_MPL_AUX_NTTP_DECL(long, n_) > struct v_at_impl\r
89 {\r
90     template< typename V > struct result_;\r
91 };\r
92 \r
93 // to work around ETI, etc.\r
94 template<> struct v_at_impl<-1>\r
95 {\r
96     template< typename V > struct result_\r
97     {\r
98         typedef void_ type;\r
99     };\r
100 };\r
101 \r
102 } // namespace aux\r
103 \r
104 template< typename T, BOOST_MPL_AUX_NTTP_DECL(long, n_) >\r
105 struct v_at\r
106     : aux::v_at_impl<n_>::template result_<T>\r
107 {\r
108 };\r
109 \r
110 #   endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\r
111 \r
112 #endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES\r
113 \r
114 }}\r
115 \r
116 #endif // BOOST_MPL_VECTOR_AUX_AT_HPP_INCLUDED\r