1 // (C) Copyright John Maddock 2005.
2 // Use, modification and distribution are subject to the
3 // Boost Software License, Version 1.0. (See accompanying file
4 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 #ifdef TEST_STD_HEADERS
9 #include <boost/tr1/array.hpp>
13 #include <boost/static_assert.hpp>
14 #include <boost/type_traits/is_same.hpp>
16 #include "verify_return.hpp"
18 template <class T
, class U
>
19 void check_tuple_access(T
& a
, const U
&)
21 typedef typename
T::value_type value_type
;
25 BOOST_STATIC_ASSERT((::boost::is_same
< typename
std::tr1::tuple_element
<0,T
>::type
, value_type
>::value
));
26 verify_return_type(&std::tr1::get
<0>(a
), static_cast<value_type
*>(0));
27 verify_return_type(&std::tr1::get
<0>(ca
), static_cast<const value_type
*>(0));
31 void check_tuple_access(T
& a
, const boost::mpl::true_
&)
33 // nothing to check the array is empty
37 void check_array(T
& a
)
39 typedef typename
T::reference reference
;
40 typedef typename
T::const_reference const_reference
;
41 typedef typename
T::iterator iterator
;
42 typedef typename
T::const_iterator const_iterator
;
43 typedef typename
T::size_type size_type
;
44 typedef typename
T::difference_type difference_type
;
45 typedef typename
T::value_type value_type
;
46 typedef typename
T::reverse_iterator reverse_iterator
;
47 typedef typename
T::const_reverse_iterator const_reverse_iterator
;
49 BOOST_STATIC_ASSERT((::boost::is_same
<value_type
&, reference
>::value
));
50 BOOST_STATIC_ASSERT((::boost::is_same
<value_type
const&, const_reference
>::value
));
51 BOOST_STATIC_ASSERT((::boost::is_same
<std::size_t, size_type
>::value
));
52 BOOST_STATIC_ASSERT((::boost::is_same
<std::ptrdiff_t, difference_type
>::value
));
53 BOOST_STATIC_ASSERT((::boost::is_same
<std::reverse_iterator
<iterator
>, reverse_iterator
>::value
));
54 BOOST_STATIC_ASSERT((::boost::is_same
<std::reverse_iterator
<const_iterator
>, const_reverse_iterator
>::value
));
58 verify_return_type(a
.begin(), iterator());
59 verify_return_type(ca
.begin(), const_iterator());
60 verify_return_type(a
.end(), iterator());
61 verify_return_type(ca
.end(), const_iterator());
62 verify_return_type(a
.rbegin(), reverse_iterator());
63 verify_return_type(ca
.rbegin(), const_reverse_iterator());
64 verify_return_type(a
.rend(), reverse_iterator());
65 verify_return_type(ca
.rend(), const_reverse_iterator());
67 verify_return_type(ca
.size(), size_type(0));
68 verify_return_type(ca
.max_size(), size_type(0));
69 verify_return_type(ca
.empty(), false);
71 verify_return_type(&a
[0], static_cast<value_type
*>(0));
72 verify_return_type(&ca
[0], static_cast<const value_type
*>(0));
73 verify_return_type(&a
.at(0), static_cast<value_type
*>(0));
74 verify_return_type(&ca
.at(0), static_cast<const value_type
*>(0));
75 verify_return_type(&a
.front(), static_cast<value_type
*>(0));
76 verify_return_type(&ca
.front(), static_cast<const value_type
*>(0));
77 verify_return_type(&a
.back(), static_cast<value_type
*>(0));
78 verify_return_type(&ca
.back(), static_cast<const value_type
*>(0));
79 verify_return_type(a
.data(), static_cast<value_type
*>(0));
80 verify_return_type(ca
.data(), static_cast<const value_type
*>(0));
84 verify_return_type(ca
== ca2
, false);
85 verify_return_type(ca
!= ca2
, false);
86 verify_return_type(ca
< ca2
, false);
87 verify_return_type(ca
> ca2
, false);
88 verify_return_type(ca
<= ca2
, false);
89 verify_return_type(ca
>= ca2
, false);
91 typedef boost::mpl::bool_
<std::tr1::tuple_size
<T
>::value
== 0> emtyness
;
92 check_tuple_access(a
, emtyness());
97 std::tr1::array
<int,2> a1
= {};
99 BOOST_STATIC_ASSERT((std::tr1::tuple_size
<std::tr1::array
<int,2> >::value
== 2));
101 std::tr1::array
<std::string
,4> a2
= { "abc", "def", "", "y", };
103 BOOST_STATIC_ASSERT((std::tr1::tuple_size
<std::tr1::array
<std::string
,4> >::value
== 4));
105 std::tr1::array
<int,0> a3
= {};
107 BOOST_STATIC_ASSERT((std::tr1::tuple_size
<std::tr1::array
<int,0> >::value
== 0));