mirror of
https://github.com/boostorg/array.git
synced 2025-07-31 21:24:39 +02:00
Merge array bug fixes to master
This commit is contained in:
@@ -7,6 +7,10 @@
|
|||||||
<firstname>Nicolai</firstname>
|
<firstname>Nicolai</firstname>
|
||||||
<surname>Josuttis</surname>
|
<surname>Josuttis</surname>
|
||||||
</author>
|
</author>
|
||||||
|
<maintainer>
|
||||||
|
<firstname>Marshall</firstname>
|
||||||
|
<surname>Clow</surname>
|
||||||
|
</maintainer>
|
||||||
|
|
||||||
<copyright>
|
<copyright>
|
||||||
<year>2001</year>
|
<year>2001</year>
|
||||||
@@ -16,6 +20,11 @@
|
|||||||
<holder>Nicolai M. Josuttis</holder>
|
<holder>Nicolai M. Josuttis</holder>
|
||||||
</copyright>
|
</copyright>
|
||||||
|
|
||||||
|
<copyright>
|
||||||
|
<year>2012</year>
|
||||||
|
<holder>Marshall Clow</holder>
|
||||||
|
</copyright>
|
||||||
|
|
||||||
<legalnotice>
|
<legalnotice>
|
||||||
<para>Distributed under the Boost Software License, Version 1.0.
|
<para>Distributed under the Boost Software License, Version 1.0.
|
||||||
(See accompanying file <filename>LICENSE_1_0.txt</filename> or copy at
|
(See accompanying file <filename>LICENSE_1_0.txt</filename> or copy at
|
||||||
@@ -176,6 +185,24 @@
|
|||||||
<returns><simpara>iterator for position after the last element</simpara></returns>
|
<returns><simpara>iterator for position after the last element</simpara></returns>
|
||||||
<throws><simpara>will not throw</simpara></throws>
|
<throws><simpara>will not throw</simpara></throws>
|
||||||
</overloaded-method>
|
</overloaded-method>
|
||||||
|
|
||||||
|
<overloaded-method name="cbegin" cv="const">
|
||||||
|
<signature>
|
||||||
|
<type>const_iterator</type>
|
||||||
|
</signature>
|
||||||
|
|
||||||
|
<returns><simpara>constant iterator for the first element</simpara></returns>
|
||||||
|
<throws><simpara>will not throw</simpara></throws>
|
||||||
|
</overloaded-method>
|
||||||
|
|
||||||
|
<overloaded-method name="cend" cv="const">
|
||||||
|
<signature>
|
||||||
|
<type>const_iterator</type>
|
||||||
|
</signature>
|
||||||
|
|
||||||
|
<returns><simpara>constant iterator for position after the last element</simpara></returns>
|
||||||
|
<throws><simpara>will not throw</simpara></throws>
|
||||||
|
</overloaded-method>
|
||||||
</method-group>
|
</method-group>
|
||||||
|
|
||||||
<method-group name="reverse iterator support">
|
<method-group name="reverse iterator support">
|
||||||
@@ -200,6 +227,24 @@
|
|||||||
|
|
||||||
<returns><simpara>reverse iterator for position after the last element in reverse iteration</simpara></returns>
|
<returns><simpara>reverse iterator for position after the last element in reverse iteration</simpara></returns>
|
||||||
</overloaded-method>
|
</overloaded-method>
|
||||||
|
|
||||||
|
<overloaded-method name="crbegin" cv="const">
|
||||||
|
<signature>
|
||||||
|
<type>const_reverse_iterator</type>
|
||||||
|
</signature>
|
||||||
|
|
||||||
|
<returns><simpara>constant reverse iterator for the first element of reverse iteration</simpara></returns>
|
||||||
|
<throws><simpara>will not throw</simpara></throws>
|
||||||
|
</overloaded-method>
|
||||||
|
|
||||||
|
<overloaded-method name="crend" cv="const">
|
||||||
|
<signature>
|
||||||
|
<type>const_reverse_iterator</type>
|
||||||
|
</signature>
|
||||||
|
|
||||||
|
<returns><simpara>constant reverse iterator for position after the last element in reverse iteration</simpara></returns>
|
||||||
|
<throws><simpara>will not throw</simpara></throws>
|
||||||
|
</overloaded-method>
|
||||||
</method-group>
|
</method-group>
|
||||||
|
|
||||||
<method-group name="capacity">
|
<method-group name="capacity">
|
||||||
@@ -465,6 +510,49 @@
|
|||||||
<returns><simpara><code>!(x < y)</code></simpara></returns>
|
<returns><simpara><code>!(x < y)</code></simpara></returns>
|
||||||
</function>
|
</function>
|
||||||
</free-function-group>
|
</free-function-group>
|
||||||
|
|
||||||
|
<free-function-group name="specializations">
|
||||||
|
<function name="boost::get">
|
||||||
|
<template>
|
||||||
|
<template-type-parameter name="T"/>
|
||||||
|
<template-nontype-parameter name="N">
|
||||||
|
<type>std::size_t</type>
|
||||||
|
</template-nontype-parameter>
|
||||||
|
<template-nontype-parameter name="Idx">
|
||||||
|
<type>std::size_t</type>
|
||||||
|
</template-nontype-parameter>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<type>T</type>
|
||||||
|
|
||||||
|
<parameter name="arr">
|
||||||
|
<paramtype><classname>array</classname><T, N>&</paramtype>
|
||||||
|
</parameter>
|
||||||
|
<returns><simpara>element of array with index <code>Idx</code></simpara></returns>
|
||||||
|
<effects><simpara>Will <code>static_assert</code> if <code>Idx >= N</code></simpara></effects>
|
||||||
|
</function>
|
||||||
|
|
||||||
|
<function name="boost::get">
|
||||||
|
<template>
|
||||||
|
<template-type-parameter name="T"/>
|
||||||
|
<template-nontype-parameter name="N">
|
||||||
|
<type>std::size_t</type>
|
||||||
|
</template-nontype-parameter>
|
||||||
|
<template-nontype-parameter name="Idx">
|
||||||
|
<type>std::size_t</type>
|
||||||
|
</template-nontype-parameter>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<type>T</type>
|
||||||
|
|
||||||
|
<parameter name="arr">
|
||||||
|
<paramtype>const <classname>array</classname><T, N>&</paramtype>
|
||||||
|
</parameter>
|
||||||
|
<returns><simpara>const element of array with index <code>Idx</code></simpara></returns>
|
||||||
|
<effects><simpara>Will <code>static_assert</code> if <code>Idx >= N</code></simpara></effects>
|
||||||
|
</function>
|
||||||
|
</free-function-group>
|
||||||
|
|
||||||
</class>
|
</class>
|
||||||
</namespace>
|
</namespace>
|
||||||
</header>
|
</header>
|
||||||
|
@@ -13,6 +13,7 @@
|
|||||||
* accompanying file LICENSE_1_0.txt or copy at
|
* accompanying file LICENSE_1_0.txt or copy at
|
||||||
* http://www.boost.org/LICENSE_1_0.txt)
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
*
|
*
|
||||||
|
* 9 Jan 2013 - (mtc) Added constexpr
|
||||||
* 14 Apr 2012 - (mtc) Added support for boost::hash
|
* 14 Apr 2012 - (mtc) Added support for boost::hash
|
||||||
* 28 Dec 2010 - (mtc) Added cbegin and cend (and crbegin and crend) for C++Ox compatibility.
|
* 28 Dec 2010 - (mtc) Added cbegin and cend (and crbegin and crend) for C++Ox compatibility.
|
||||||
* 10 Mar 2010 - (mtc) fill method added, matching resolution of the standard library working group.
|
* 10 Mar 2010 - (mtc) fill method added, matching resolution of the standard library working group.
|
||||||
@@ -42,12 +43,12 @@
|
|||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
|
#include <boost/static_assert.hpp>
|
||||||
#include <boost/swap.hpp>
|
#include <boost/swap.hpp>
|
||||||
|
|
||||||
// Handles broken standard libraries better than <iterator>
|
// Handles broken standard libraries better than <iterator>
|
||||||
#include <boost/detail/iterator.hpp>
|
#include <boost/detail/iterator.hpp>
|
||||||
#include <boost/throw_exception.hpp>
|
#include <boost/throw_exception.hpp>
|
||||||
#include <boost/functional/hash_fwd.hpp>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
// FIXES for broken compilers
|
// FIXES for broken compilers
|
||||||
@@ -81,15 +82,9 @@ namespace boost {
|
|||||||
const_iterator cend() const { return elems+N; }
|
const_iterator cend() const { return elems+N; }
|
||||||
|
|
||||||
// reverse iterator support
|
// reverse iterator support
|
||||||
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS)
|
#if !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS)
|
||||||
typedef std::reverse_iterator<iterator> reverse_iterator;
|
typedef std::reverse_iterator<iterator> reverse_iterator;
|
||||||
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
|
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
|
||||||
#elif defined(_MSC_VER) && (_MSC_VER == 1300) && defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB == 310)
|
|
||||||
// workaround for broken reverse_iterator in VC7
|
|
||||||
typedef std::reverse_iterator<std::_Ptrit<value_type, difference_type, iterator,
|
|
||||||
reference, iterator, reference> > reverse_iterator;
|
|
||||||
typedef std::reverse_iterator<std::_Ptrit<value_type, difference_type, const_iterator,
|
|
||||||
const_reference, iterator, reference> > const_reverse_iterator;
|
|
||||||
#elif defined(_RWSTD_NO_CLASS_PARTIAL_SPEC)
|
#elif defined(_RWSTD_NO_CLASS_PARTIAL_SPEC)
|
||||||
typedef std::reverse_iterator<iterator, std::random_access_iterator_tag,
|
typedef std::reverse_iterator<iterator, std::random_access_iterator_tag,
|
||||||
value_type, reference, iterator, difference_type> reverse_iterator;
|
value_type, reference, iterator, difference_type> reverse_iterator;
|
||||||
@@ -120,19 +115,17 @@ namespace boost {
|
|||||||
// operator[]
|
// operator[]
|
||||||
reference operator[](size_type i)
|
reference operator[](size_type i)
|
||||||
{
|
{
|
||||||
BOOST_ASSERT_MSG( i < N, "out of range" );
|
return BOOST_ASSERT_MSG( i < N, "out of range" ), elems[i];
|
||||||
return elems[i];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const_reference operator[](size_type i) const
|
/*BOOST_CONSTEXPR*/ const_reference operator[](size_type i) const
|
||||||
{
|
{
|
||||||
BOOST_ASSERT_MSG( i < N, "out of range" );
|
return BOOST_ASSERT_MSG( i < N, "out of range" ), elems[i];
|
||||||
return elems[i];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// at() with range check
|
// at() with range check
|
||||||
reference at(size_type i) { rangecheck(i); return elems[i]; }
|
reference at(size_type i) { return rangecheck(i), elems[i]; }
|
||||||
const_reference at(size_type i) const { rangecheck(i); return elems[i]; }
|
/*BOOST_CONSTEXPR*/ const_reference at(size_type i) const { return rangecheck(i), elems[i]; }
|
||||||
|
|
||||||
// front() and back()
|
// front() and back()
|
||||||
reference front()
|
reference front()
|
||||||
@@ -140,7 +133,7 @@ namespace boost {
|
|||||||
return elems[0];
|
return elems[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
const_reference front() const
|
BOOST_CONSTEXPR const_reference front() const
|
||||||
{
|
{
|
||||||
return elems[0];
|
return elems[0];
|
||||||
}
|
}
|
||||||
@@ -150,15 +143,15 @@ namespace boost {
|
|||||||
return elems[N-1];
|
return elems[N-1];
|
||||||
}
|
}
|
||||||
|
|
||||||
const_reference back() const
|
BOOST_CONSTEXPR const_reference back() const
|
||||||
{
|
{
|
||||||
return elems[N-1];
|
return elems[N-1];
|
||||||
}
|
}
|
||||||
|
|
||||||
// size is constant
|
// size is constant
|
||||||
static size_type size() { return N; }
|
static BOOST_CONSTEXPR size_type size() { return N; }
|
||||||
static bool empty() { return false; }
|
static BOOST_CONSTEXPR bool empty() { return false; }
|
||||||
static size_type max_size() { return N; }
|
static BOOST_CONSTEXPR size_type max_size() { return N; }
|
||||||
enum { static_size = N };
|
enum { static_size = N };
|
||||||
|
|
||||||
// swap (note: linear complexity)
|
// swap (note: linear complexity)
|
||||||
@@ -189,16 +182,12 @@ namespace boost {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check range (may be private because it is static)
|
// check range (may be private because it is static)
|
||||||
static void rangecheck (size_type i) {
|
static BOOST_CONSTEXPR bool rangecheck (size_type i) {
|
||||||
if (i >= size()) {
|
return i > size() ? boost::throw_exception(std::out_of_range ("array<>: index out of range")), true : true;
|
||||||
std::out_of_range e("array<>: index out of range");
|
|
||||||
boost::throw_exception(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
|
|
||||||
template< class T >
|
template< class T >
|
||||||
class array< T, 0 > {
|
class array< T, 0 > {
|
||||||
|
|
||||||
@@ -222,15 +211,9 @@ namespace boost {
|
|||||||
const_iterator cend() const { return cbegin(); }
|
const_iterator cend() const { return cbegin(); }
|
||||||
|
|
||||||
// reverse iterator support
|
// reverse iterator support
|
||||||
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS)
|
#if !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS)
|
||||||
typedef std::reverse_iterator<iterator> reverse_iterator;
|
typedef std::reverse_iterator<iterator> reverse_iterator;
|
||||||
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
|
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
|
||||||
#elif defined(_MSC_VER) && (_MSC_VER == 1300) && defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB == 310)
|
|
||||||
// workaround for broken reverse_iterator in VC7
|
|
||||||
typedef std::reverse_iterator<std::_Ptrit<value_type, difference_type, iterator,
|
|
||||||
reference, iterator, reference> > reverse_iterator;
|
|
||||||
typedef std::reverse_iterator<std::_Ptrit<value_type, difference_type, const_iterator,
|
|
||||||
const_reference, iterator, reference> > const_reverse_iterator;
|
|
||||||
#elif defined(_RWSTD_NO_CLASS_PARTIAL_SPEC)
|
#elif defined(_RWSTD_NO_CLASS_PARTIAL_SPEC)
|
||||||
typedef std::reverse_iterator<iterator, std::random_access_iterator_tag,
|
typedef std::reverse_iterator<iterator, std::random_access_iterator_tag,
|
||||||
value_type, reference, iterator, difference_type> reverse_iterator;
|
value_type, reference, iterator, difference_type> reverse_iterator;
|
||||||
@@ -264,14 +247,14 @@ namespace boost {
|
|||||||
return failed_rangecheck();
|
return failed_rangecheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
const_reference operator[](size_type /*i*/) const
|
/*BOOST_CONSTEXPR*/ const_reference operator[](size_type /*i*/) const
|
||||||
{
|
{
|
||||||
return failed_rangecheck();
|
return failed_rangecheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
// at() with range check
|
// at() with range check
|
||||||
reference at(size_type /*i*/) { return failed_rangecheck(); }
|
reference at(size_type /*i*/) { return failed_rangecheck(); }
|
||||||
const_reference at(size_type /*i*/) const { return failed_rangecheck(); }
|
/*BOOST_CONSTEXPR*/ const_reference at(size_type /*i*/) const { return failed_rangecheck(); }
|
||||||
|
|
||||||
// front() and back()
|
// front() and back()
|
||||||
reference front()
|
reference front()
|
||||||
@@ -279,7 +262,7 @@ namespace boost {
|
|||||||
return failed_rangecheck();
|
return failed_rangecheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
const_reference front() const
|
BOOST_CONSTEXPR const_reference front() const
|
||||||
{
|
{
|
||||||
return failed_rangecheck();
|
return failed_rangecheck();
|
||||||
}
|
}
|
||||||
@@ -289,15 +272,15 @@ namespace boost {
|
|||||||
return failed_rangecheck();
|
return failed_rangecheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
const_reference back() const
|
BOOST_CONSTEXPR const_reference back() const
|
||||||
{
|
{
|
||||||
return failed_rangecheck();
|
return failed_rangecheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
// size is constant
|
// size is constant
|
||||||
static size_type size() { return 0; }
|
static BOOST_CONSTEXPR size_type size() { return 0; }
|
||||||
static bool empty() { return true; }
|
static BOOST_CONSTEXPR bool empty() { return true; }
|
||||||
static size_type max_size() { return 0; }
|
static BOOST_CONSTEXPR size_type max_size() { return 0; }
|
||||||
enum { static_size = 0 };
|
enum { static_size = 0 };
|
||||||
|
|
||||||
void swap (array<T,0>& /*y*/) {
|
void swap (array<T,0>& /*y*/) {
|
||||||
@@ -335,7 +318,6 @@ namespace boost {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
// comparisons
|
// comparisons
|
||||||
template<class T, std::size_t N>
|
template<class T, std::size_t N>
|
||||||
@@ -391,7 +373,7 @@ namespace boost {
|
|||||||
|
|
||||||
// Specific for boost::array: simply returns its elems data member.
|
// Specific for boost::array: simply returns its elems data member.
|
||||||
template <typename T, std::size_t N>
|
template <typename T, std::size_t N>
|
||||||
typename const detail::c_array<T,N>::type& get_c_array(const boost::array<T,N>& arg)
|
typename detail::c_array<T,N>::type const& get_c_array(const boost::array<T,N>& arg)
|
||||||
{
|
{
|
||||||
return arg.elems;
|
return arg.elems;
|
||||||
}
|
}
|
||||||
@@ -429,6 +411,7 @@ namespace boost {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
template <class It> std::size_t hash_range(It, It);
|
||||||
|
|
||||||
template<class T, std::size_t N>
|
template<class T, std::size_t N>
|
||||||
std::size_t hash_value(const array<T,N>& arr)
|
std::size_t hash_value(const array<T,N>& arr)
|
||||||
@@ -436,8 +419,36 @@ namespace boost {
|
|||||||
return boost::hash_range(arr.begin(), arr.end());
|
return boost::hash_range(arr.begin(), arr.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <size_t Idx, typename T, size_t N>
|
||||||
|
T &get(boost::array<T,N> &arr) BOOST_NOEXCEPT {
|
||||||
|
BOOST_STATIC_ASSERT_MSG ( Idx < N, "boost::get<>(boost::array &) index out of range" );
|
||||||
|
return arr[Idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
template <size_t Idx, typename T, size_t N>
|
||||||
|
const T &get(const boost::array<T,N> &arr) BOOST_NOEXCEPT {
|
||||||
|
BOOST_STATIC_ASSERT_MSG ( Idx < N, "boost::get<>(const boost::array &) index out of range" );
|
||||||
|
return arr[Idx];
|
||||||
|
}
|
||||||
|
|
||||||
} /* namespace boost */
|
} /* namespace boost */
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_CXX11_HDR_ARRAY
|
||||||
|
// If we don't have std::array, I'm assuming that we don't have std::get
|
||||||
|
namespace std {
|
||||||
|
template <size_t Idx, typename T, size_t N>
|
||||||
|
T &get(boost::array<T,N> &arr) BOOST_NOEXCEPT {
|
||||||
|
BOOST_STATIC_ASSERT_MSG ( Idx < N, "std::get<>(boost::array &) index out of range" );
|
||||||
|
return arr[Idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
template <size_t Idx, typename T, size_t N>
|
||||||
|
const T &get(const boost::array<T,N> &arr) BOOST_NOEXCEPT {
|
||||||
|
BOOST_STATIC_ASSERT_MSG ( Idx < N, "std::get<>(const boost::array &) index out of range" );
|
||||||
|
return arr[Idx];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
|
#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
|
||||||
# pragma warning(pop)
|
# pragma warning(pop)
|
||||||
|
17
meta/libraries.json
Normal file
17
meta/libraries.json
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"key": "array",
|
||||||
|
"name": "Array",
|
||||||
|
"authors": [
|
||||||
|
"Nicolai Josuttis"
|
||||||
|
],
|
||||||
|
"description": "STL compliant container wrapper for arrays of constant size.",
|
||||||
|
"std": [
|
||||||
|
"tr1"
|
||||||
|
],
|
||||||
|
"category": [
|
||||||
|
"Containers"
|
||||||
|
],
|
||||||
|
"maintainers": [
|
||||||
|
"Marshall Clow <marshall -at- idio.com>"
|
||||||
|
]
|
||||||
|
}
|
@@ -17,5 +17,9 @@ test-suite array :
|
|||||||
[ run array4.cpp ]
|
[ run array4.cpp ]
|
||||||
[ run array5.cpp ]
|
[ run array5.cpp ]
|
||||||
[ run array6.cpp unit_test_framework : : : : array6 ]
|
[ run array6.cpp unit_test_framework : : : : array6 ]
|
||||||
|
[ run array7.cpp unit_test_framework : : : : array7 ]
|
||||||
|
# [ run array_constexpr.cpp unit_test_framework : : : : array_constexpr ]
|
||||||
|
[ compile-fail array_getfail1.cpp ]
|
||||||
|
[ compile-fail array_getfail2.cpp ]
|
||||||
[ run array_hash.cpp unit_test_framework : : : : array_hash ]
|
[ run array_hash.cpp unit_test_framework : : : : array_hash ]
|
||||||
;
|
;
|
||||||
|
67
test/array7.cpp
Normal file
67
test/array7.cpp
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
/* tests using std::get on boost:array
|
||||||
|
* (C) Copyright Marshall Clow 2012
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See
|
||||||
|
* accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
#include <boost/array.hpp>
|
||||||
|
#include <algorithm>
|
||||||
|
#ifndef BOOST_NO_CXX11_HDR_ARRAY
|
||||||
|
#include <array>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define BOOST_TEST_MAIN
|
||||||
|
#include <boost/test/unit_test.hpp>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_CXX11_HDR_ARRAY
|
||||||
|
template< class T >
|
||||||
|
void RunStdTests()
|
||||||
|
{
|
||||||
|
typedef boost::array< T, 5 > test_type;
|
||||||
|
typedef T arr[5];
|
||||||
|
test_type test_case; // = { 1, 1, 2, 3, 5 };
|
||||||
|
|
||||||
|
T &aRef = std::get<0> ( test_case );
|
||||||
|
BOOST_CHECK ( &*test_case.begin () == &aRef );
|
||||||
|
|
||||||
|
const T &caRef = std::get<0> ( test_case );
|
||||||
|
BOOST_CHECK ( &*test_case.cbegin () == &caRef );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template< class T >
|
||||||
|
void RunBoostTests()
|
||||||
|
{
|
||||||
|
typedef boost::array< T, 5 > test_type;
|
||||||
|
typedef T arr[5];
|
||||||
|
test_type test_case; // = { 1, 1, 2, 3, 5 };
|
||||||
|
|
||||||
|
T &aRef = boost::get<0> ( test_case );
|
||||||
|
BOOST_CHECK ( &*test_case.begin () == &aRef );
|
||||||
|
|
||||||
|
const T &caRef = boost::get<0> ( test_case );
|
||||||
|
BOOST_CHECK ( &*test_case.cbegin () == &caRef );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE( test_main )
|
||||||
|
{
|
||||||
|
RunBoostTests< bool >();
|
||||||
|
RunBoostTests< void * >();
|
||||||
|
RunBoostTests< long double >();
|
||||||
|
RunBoostTests< std::string >();
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_CXX11_HDR_ARRAY
|
||||||
|
RunStdTests< bool >();
|
||||||
|
RunStdTests< void * >();
|
||||||
|
RunStdTests< long double >();
|
||||||
|
RunStdTests< std::string >();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
42
test/array_constexpr.cpp
Normal file
42
test/array_constexpr.cpp
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/* tests using constexpr on boost:array
|
||||||
|
* (C) Copyright Marshall Clow 2012
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See
|
||||||
|
* accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
#include <boost/array.hpp>
|
||||||
|
#include <algorithm>
|
||||||
|
#ifndef BOOST_NO_CXX11_HDR_ARRAY
|
||||||
|
#include <array>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define BOOST_TEST_MAIN
|
||||||
|
#include <boost/test/unit_test.hpp>
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_CXX11_CONSTEXPR
|
||||||
|
constexpr boost::array<int, 10> arr {{ 0,1,2,3,4,5,6,7,8,9 }};
|
||||||
|
constexpr std::array<int, 10> arr_std {{ 0,1,2,3,4,5,6,7,8,9 }};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void sink ( T t ) {}
|
||||||
|
|
||||||
|
template <typename T, size_t N>
|
||||||
|
void sink ( boost::array<T,N> &arr ) {}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE( test_main )
|
||||||
|
{
|
||||||
|
// constexpr int two = arr_std.at (2);
|
||||||
|
constexpr int three = arr.at (3);
|
||||||
|
int whatever [ arr.at(4) ];
|
||||||
|
(void)three;
|
||||||
|
(void) whatever;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else // no constexpr means no constexpr tests!
|
||||||
|
BOOST_AUTO_TEST_CASE( test_main )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
49
test/array_getfail1.cpp
Normal file
49
test/array_getfail1.cpp
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
/* tests using std::get on boost:array
|
||||||
|
* (C) Copyright Marshall Clow 2012
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See
|
||||||
|
* accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <boost/array.hpp>
|
||||||
|
#include <boost/static_assert.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
#include <algorithm>
|
||||||
|
#ifndef BOOST_NO_CXX11_HDR_ARRAY
|
||||||
|
#include <array>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define BOOST_TEST_MAIN
|
||||||
|
#include <boost/test/unit_test.hpp>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_CXX11_HDR_ARRAY
|
||||||
|
template< class T >
|
||||||
|
void RunStdTests()
|
||||||
|
{
|
||||||
|
typedef boost::array< T, 5 > test_type;
|
||||||
|
typedef T arr[5];
|
||||||
|
test_type test_case; // = { 1, 1, 2, 3, 5 };
|
||||||
|
|
||||||
|
T &aRef = std::get<5> ( test_case ); // should fail to compile
|
||||||
|
BOOST_CHECK ( &*test_case.begin () == &aRef );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE( test_main )
|
||||||
|
{
|
||||||
|
#ifndef BOOST_NO_CXX11_HDR_ARRAY
|
||||||
|
RunStdTests< bool >();
|
||||||
|
RunStdTests< void * >();
|
||||||
|
RunStdTests< long double >();
|
||||||
|
RunStdTests< std::string >();
|
||||||
|
#else
|
||||||
|
BOOST_STATIC_ASSERT ( false ); // fail on C++03 systems.
|
||||||
|
#endif
|
||||||
|
}
|
64
test/array_getfail2.cpp
Normal file
64
test/array_getfail2.cpp
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
/* tests using std::get on boost:array
|
||||||
|
* (C) Copyright Marshall Clow 2012
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See
|
||||||
|
* accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
#include <boost/array.hpp>
|
||||||
|
#include <algorithm>
|
||||||
|
#ifndef BOOST_NO_CXX11_HDR_ARRAY
|
||||||
|
#include <array>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define BOOST_TEST_MAIN
|
||||||
|
#include <boost/test/unit_test.hpp>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_CXX11_HDR_ARRAY
|
||||||
|
template< class T >
|
||||||
|
void RunStdTests()
|
||||||
|
{
|
||||||
|
typedef boost::array< T, 5 > test_type;
|
||||||
|
typedef T arr[5];
|
||||||
|
test_type test_case; // = { 1, 1, 2, 3, 5 };
|
||||||
|
|
||||||
|
T &aRef = std::get<0> ( test_case );
|
||||||
|
BOOST_CHECK ( &*test_case.begin () == &aRef );
|
||||||
|
|
||||||
|
const T &caRef = std::get<0> ( test_case );
|
||||||
|
BOOST_CHECK ( &*test_case.cbegin () == &caRef );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template< class T >
|
||||||
|
void RunBoostTests()
|
||||||
|
{
|
||||||
|
typedef boost::array< T, 5 > test_type;
|
||||||
|
typedef T arr[5];
|
||||||
|
test_type test_case; // = { 1, 1, 2, 3, 5 };
|
||||||
|
|
||||||
|
T &aRef = boost::get<5> ( test_case );
|
||||||
|
BOOST_CHECK ( &*test_case.begin () == &aRef );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE( test_main )
|
||||||
|
{
|
||||||
|
RunBoostTests< bool >();
|
||||||
|
RunBoostTests< void * >();
|
||||||
|
RunBoostTests< long double >();
|
||||||
|
RunBoostTests< std::string >();
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_CXX11_HDR_ARRAY
|
||||||
|
RunStdTests< bool >();
|
||||||
|
RunStdTests< void * >();
|
||||||
|
RunStdTests< long double >();
|
||||||
|
RunStdTests< std::string >();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
Reference in New Issue
Block a user