mirror of
https://github.com/boostorg/array.git
synced 2025-06-26 12:31:41 +02:00
Compare commits
1 Commits
svn-branch
...
svn-branch
Author | SHA1 | Date | |
---|---|---|---|
2a876cf76e |
169
array.hpp.html
Normal file
169
array.hpp.html
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
<HTML>
|
||||||
|
<HEAD>
|
||||||
|
<TITLE>array.hpp</TITLE>
|
||||||
|
</HEAD>
|
||||||
|
|
||||||
|
<BODY TEXT="#000000" BGCOLOR="#FFFFFF">
|
||||||
|
|
||||||
|
<TABLE HEIGHT=40 WIDTH="100%">
|
||||||
|
<TR> <TD ALIGN=LEFT WIDTH="100%" BGCOLOR="#DDDDDD">
|
||||||
|
<FONT face="Arial,Helvetica" size=+2><B>
|
||||||
|
array.hpp
|
||||||
|
</B></FONT>
|
||||||
|
</TD></TR></TABLE><BR>
|
||||||
|
|
||||||
|
<BR><BR>
|
||||||
|
<TT>
|
||||||
|
<SPAN class="Source">
|
||||||
|
<Font color="0000FF" >/</FONT><I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* The following code declares class array,</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* an STL container (as wrapper) for arrays of constant size.</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >*</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* See</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* http://www.josuttis.com/cppcode</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* for details and the latest version.</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >*</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* (C) Copyright Nicolai M. Josuttis 1999.</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* Permission to copy, use, modify, sell and distribute this software</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* is granted provided this copyright notice appears in all copies.</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* This software is provided "as is" without express or implied</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* warranty, and with no claim as to its suitability for any purpose.</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >*</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* Jul 31, 2000</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >*/</FONT></I><BR>
|
||||||
|
#ifndef BOOST_ARRAY_HPP<BR>
|
||||||
|
#define BOOST_ARRAY_HPP<BR>
|
||||||
|
<BR>
|
||||||
|
#include <cstddef><BR>
|
||||||
|
#include <stdexcept><BR>
|
||||||
|
#include <iterator><BR>
|
||||||
|
#include <algorithm><BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// BUG-FIX for compilers that don't support</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// std::size_t and std::ptrdiff_t yet</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// (such as gcc)</FONT></I><BR>
|
||||||
|
#include <<A href="./config.hpp.html">boost/config.hpp</A>><BR>
|
||||||
|
<BR>
|
||||||
|
namespace boost {<BR>
|
||||||
|
<BR>
|
||||||
|
template<class T, std::size_t N><BR>
|
||||||
|
class array {<BR>
|
||||||
|
public:<BR>
|
||||||
|
T elems[N]; <I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// fixed-size array of elements of type T</FONT></I><BR>
|
||||||
|
<BR>
|
||||||
|
public:<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// type definitions</FONT></I><BR>
|
||||||
|
typedef T value_type;<BR>
|
||||||
|
typedef T* iterator;<BR>
|
||||||
|
typedef const T* const_iterator;<BR>
|
||||||
|
typedef T& reference;<BR>
|
||||||
|
typedef const T& const_reference;<BR>
|
||||||
|
typedef std::size_t size_type;<BR>
|
||||||
|
typedef std::ptrdiff_t difference_type;<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// iterator support</FONT></I><BR>
|
||||||
|
iterator begin() { return elems; }<BR>
|
||||||
|
const_iterator begin() const { return elems; }<BR>
|
||||||
|
iterator end() { return elems+N; }<BR>
|
||||||
|
const_iterator end() const { return elems+N; }<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// reverse iterator support</FONT></I><BR>
|
||||||
|
typedef std::reverse_iterator<iterator> reverse_iterator;<BR>
|
||||||
|
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;<BR>
|
||||||
|
reverse_iterator rbegin() { return reverse_iterator(end()); }<BR>
|
||||||
|
const_reverse_iterator rbegin() const {<BR>
|
||||||
|
return const_reverse_iterator(end());<BR>
|
||||||
|
}<BR>
|
||||||
|
reverse_iterator rend() { return reverse_iterator(begin()); }<BR>
|
||||||
|
const_reverse_iterator rend() const {<BR>
|
||||||
|
return const_reverse_iterator(begin());<BR>
|
||||||
|
}<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// operator[]</FONT></I><BR>
|
||||||
|
reference operator[](size_type i) { return elems[i]; }<BR>
|
||||||
|
const_reference operator[](size_type i) const { return elems[i]; }<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// at() with range check</FONT></I><BR>
|
||||||
|
reference at(size_type i) { rangecheck(i); return elems[i]; }<BR>
|
||||||
|
const_reference at(size_type i) const { rangecheck(i); return elems[i]; }<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// front() and back()</FONT></I><BR>
|
||||||
|
reference front() { return elems[0]; }<BR>
|
||||||
|
const_reference front() const { return elems[0]; }<BR>
|
||||||
|
reference back() { return elems[N-1]; }<BR>
|
||||||
|
const_reference back() const { return elems[N-1]; }<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// size is constant</FONT></I><BR>
|
||||||
|
static size_type size() { return N; }<BR>
|
||||||
|
static bool empty() { return false; }<BR>
|
||||||
|
static size_type max_size() { return N; }<BR>
|
||||||
|
enum { static_size = N };<BR>
|
||||||
|
<BR>
|
||||||
|
public:<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// swap (note: linear complexity)</FONT></I><BR>
|
||||||
|
void swap (array<T,N>& y) {<BR>
|
||||||
|
std::swap_ranges(begin(),end(),y.begin());<BR>
|
||||||
|
}<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// direct access to data</FONT></I><BR>
|
||||||
|
const T* data() const { return elems; }<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// assignment with type conversion</FONT></I><BR>
|
||||||
|
template <typename T2><BR>
|
||||||
|
array<T,N>& operator= (const array<T2,N>& rhs) {<BR>
|
||||||
|
std::copy(rhs.begin(),rhs.end(), begin());<BR>
|
||||||
|
return *this;<BR>
|
||||||
|
}<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// assign one value to all elements</FONT></I><BR>
|
||||||
|
void assign (const T& value)<BR>
|
||||||
|
{<BR>
|
||||||
|
std::fill_n(begin(),size(),value);<BR>
|
||||||
|
}<BR>
|
||||||
|
<BR>
|
||||||
|
private:<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// check range (may be private because it is static)</FONT></I><BR>
|
||||||
|
static void rangecheck (size_type i) {<BR>
|
||||||
|
if (i >= size()) { throw std::range_error("array"); }<BR>
|
||||||
|
}<BR>
|
||||||
|
<BR>
|
||||||
|
};<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// comparisons</FONT></I><BR>
|
||||||
|
template<class T, std::size_t N><BR>
|
||||||
|
bool operator== (const array<T,N>& x, const array<T,N>& y) {<BR>
|
||||||
|
return std::equal(x.begin(), x.end(), y.begin());<BR>
|
||||||
|
}<BR>
|
||||||
|
template<class T, std::size_t N><BR>
|
||||||
|
bool operator< (const array<T,N>& x, const array<T,N>& y) {<BR>
|
||||||
|
return std::lexicographical_compare(x.begin(),x.end(),y.begin(),y.end());<BR>
|
||||||
|
}<BR>
|
||||||
|
template<class T, std::size_t N><BR>
|
||||||
|
bool operator!= (const array<T,N>& x, const array<T,N>& y) {<BR>
|
||||||
|
return !(x==y);<BR>
|
||||||
|
}<BR>
|
||||||
|
template<class T, std::size_t N><BR>
|
||||||
|
bool operator> (const array<T,N>& x, const array<T,N>& y) {<BR>
|
||||||
|
return y<x;<BR>
|
||||||
|
}<BR>
|
||||||
|
template<class T, std::size_t N><BR>
|
||||||
|
bool operator<= (const array<T,N>& x, const array<T,N>& y) {<BR>
|
||||||
|
return !(y<x);<BR>
|
||||||
|
}<BR>
|
||||||
|
template<class T, std::size_t N><BR>
|
||||||
|
bool operator>= (const array<T,N>& x, const array<T,N>& y) {<BR>
|
||||||
|
return !(x<y);<BR>
|
||||||
|
}<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// global swap()</FONT></I><BR>
|
||||||
|
template<class T, std::size_t N><BR>
|
||||||
|
inline void swap (array<T,N>& x, array<T,N>& y) {<BR>
|
||||||
|
x.swap(y);<BR>
|
||||||
|
}<BR>
|
||||||
|
<BR>
|
||||||
|
} <I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >/* namespace boost */</FONT></I><BR>
|
||||||
|
<BR>
|
||||||
|
#endif <I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >/*BOOST_ARRAY_HPP*/</FONT></I><BR>
|
||||||
|
</SPAN>
|
||||||
|
</TT>
|
||||||
|
</BODY>
|
||||||
|
</HTML>
|
320
array.html
Normal file
320
array.html
Normal file
@ -0,0 +1,320 @@
|
|||||||
|
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<meta name="Keywords" content="array, block, carray, c_array, array wrapper, adapter, adaptor, STL, C++ Standard Library, array.hpp">
|
||||||
|
|
||||||
|
<title>array.hpp, an STL Array Wrapper</title>
|
||||||
|
</head>
|
||||||
|
<body text="#000000" bgcolor="#FFFFFF" link="#186ABF">
|
||||||
|
<font face="Arial, Helvetica, sans-serif"> </font>
|
||||||
|
<table width="100%" height="40">
|
||||||
|
<tr>
|
||||||
|
<td BGCOLOR="#DDDDDD"><b><font face="Arial,helvetica" color="#000000" size="+1">Class
|
||||||
|
<font face="Courier New, Courier, mono">array</font>, an STL Container (as
|
||||||
|
Wrapper) for Arrays of Constant Size</font></b></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<p><font face="Arial, Helvetica, sans-serif" size="-1">The C++ Standard Template
|
||||||
|
Library STL as part of the C++ Standard Library provides a framework for processing
|
||||||
|
algorithms on different kind of containers. However, ordinary arrays don't provide
|
||||||
|
the interface of STL containers (although, they provide the iterator interface
|
||||||
|
of STL containers).</font>
|
||||||
|
<p><font face="Arial, Helvetica, sans-serif" size="-1">As replacement for ordinary
|
||||||
|
arrays, the STL provides class <font face="Courier New, Courier, mono">vector<></font>.
|
||||||
|
However, <font face="Courier New, Courier, mono">vector<></font> provides
|
||||||
|
the semantics of dynamic arrays. Thus, it manages data to be able to change
|
||||||
|
the number of elements. This results in some overhead in case only arrays with
|
||||||
|
static size are needed.</font>
|
||||||
|
<p><font face="Arial, Helvetica, sans-serif" size="-1">In his book, <i>Generic
|
||||||
|
Programming and the STL</i>, Matthew H. Austern introduces a useful wrapper
|
||||||
|
class for ordinary arrays with static size, called <font face="Courier New, Courier, mono"><b>block</b></font>.
|
||||||
|
It is safer and has no worse performance than ordinary arrays. In <i>The C++
|
||||||
|
Programming Language</i>, 3rd edition, Bjarne Stroustrup introduces a similar
|
||||||
|
class, called <font face="Courier New, Courier, mono"><b>c_array</b></font>,
|
||||||
|
which I (<a href="http://www.josuttis.com">Nicolai Josuttis</a>) present slightly
|
||||||
|
modified in my book <i>The C++ Standard Library - A Tutorial and Reference</i>,
|
||||||
|
called <font face="Courier New, Courier, mono"><b>carray</b></font>. This is
|
||||||
|
the essence of these approaches spiced with many feedback from <a href="http://www.boost.org">boost</a>.</font>
|
||||||
|
<p><font face="Arial, Helvetica, sans-serif" size="-1">After considering different
|
||||||
|
names, we decided to name this class simply <font face="Courier New, Courier, mono"><b>array</b></font>.</font>
|
||||||
|
<p><font face="Arial, Helvetica, sans-serif" size="-1">The class provides the
|
||||||
|
following interface:</font>
|
||||||
|
<table border="0">
|
||||||
|
<tr>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1"><b>Types:</b></font></td>
|
||||||
|
<td><font size="-1"></font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">value_type</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">type of the elements</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">iterator</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">type of the iterator
|
||||||
|
(random-access iterator)</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">const_iterator</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">type of iterator that
|
||||||
|
considers elements as being constant</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">reference</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">type of element reference</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">const_reference</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">type of element reference
|
||||||
|
that considers elements as being constant</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">size_type</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">type for signed size
|
||||||
|
values</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">difference_type</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">type for unsigned
|
||||||
|
difference values</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1"><b>Operations:</b></font></td>
|
||||||
|
<td><font size="-1"></font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p><font face="Courier New, Courier, mono" size="-1">array<<i>type</i>,<i>num</i>></font></p>
|
||||||
|
</td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">default constructor,
|
||||||
|
creates array of <i><font face="Courier New, Courier, mono">num</font></i>
|
||||||
|
element of <i><font face="Courier New, Courier, mono">type</font></i>, see
|
||||||
|
comment below</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">array<<i>type</i>,<i>num</i>>(<i>a</i>)</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">copy constructor,
|
||||||
|
copies all elements of <i><font face="Courier New, Courier, mono">a</font></i>
|
||||||
|
(<i><font face="Courier New, Courier, mono">a</font></i> must have same
|
||||||
|
<i> <font face="Courier New, Courier, mono">type</font></i><font face="Courier New, Courier, mono"><font face="Arial, Helvetica, sans-serif">
|
||||||
|
and </font></font><i><font face="Courier New, Courier, mono">num</font></i>)</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">operator=</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">assignment, assigns
|
||||||
|
all elements</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">assign(<i>val</i>)</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">assigns <i>val</i>
|
||||||
|
to all elements</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">begin()</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">returns iterator for
|
||||||
|
the first element</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">end()</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">returns iterator for
|
||||||
|
position after the last element</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">rbegin()</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">returns reverse iterator
|
||||||
|
for position of first element of reverse iteration</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">rend()</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">returns reverse iterator
|
||||||
|
for posistion behind last element of reverese iteration </font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">operator[<i>i</i>]</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">returns element with
|
||||||
|
index <i><font face="Courier New, Courier, mono">i</font></i> (no range
|
||||||
|
checking)</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">at(<i>i</i>)</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">returns element with
|
||||||
|
index <font face="Courier New, Courier, mono"><i>i</i></font> (throw std::range_error
|
||||||
|
if <i><font face="Courier New, Courier, mono">i</font></i> is not valid)</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">front()</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">returns first element
|
||||||
|
(caller has to ensure that it exists)</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">back()</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">returns last element
|
||||||
|
(caller has to ensure that it exists)</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">data()</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">returns raw element
|
||||||
|
array for read-only element access</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">size()</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">returns number of
|
||||||
|
elements</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">empty()</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">returns whether array
|
||||||
|
is empty</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">max_size()</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">returns maximum possible
|
||||||
|
number of elements (same as size())</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">swap(a)</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">swap elements with
|
||||||
|
array a</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">==<font face="Arial, Helvetica, sans-serif">,
|
||||||
|
</font>!=</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">checks for equality</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1"><<font face="Arial, Helvetica, sans-serif">,
|
||||||
|
</font><=<font face="Arial, Helvetica, sans-serif">, </font>><font face="Arial, Helvetica, sans-serif">,
|
||||||
|
</font>>=</font></td>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1">compares array</font></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Arial, Helvetica, sans-serif" size="-1"><b>Values:</b></font></td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><font face="Courier New, Courier, mono" size="-1">static_size</font></td>
|
||||||
|
<td><font size="-1" face="Arial, Helvetica, sans-serif">yields size at compile
|
||||||
|
time</font></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<p><font face="Arial, Helvetica, sans-serif" size="-1">Class array fulfills most
|
||||||
|
but not all of the requirements of "reversible containers" (see Section
|
||||||
|
23.1, [lib.container.requirements] of the C++ Standard). The reasons array is
|
||||||
|
not an reversible STL container is because: </font> <font face="Arial, Helvetica, sans-serif" size="-1"><br>
|
||||||
|
- No constructors are provided<br>
|
||||||
|
- Elements may have an indetermined initial value (see below)<br>
|
||||||
|
- swap() has no constant complexity<br>
|
||||||
|
- size() is always constant, based on the second template argument of the type<br>
|
||||||
|
- The container provides no allocator support</font>
|
||||||
|
<p><font face="Arial, Helvetica, sans-serif" size="-1">It doesn't fulfill the
|
||||||
|
requirements of a "sequence" (see Section 23.1.1, [lib.sequence.reqmts]
|
||||||
|
of the C++ Standard), except that</font> <font face="Arial, Helvetica, sans-serif" size="-1"><br>
|
||||||
|
- front() and back() are provided<br>
|
||||||
|
- operator[] and at() are provided</font>
|
||||||
|
<p><font face="Arial, Helvetica, sans-serif" size="-1">Regarding the constructors
|
||||||
|
there was an important design tradeoff: We could implement array as an "<b>aggregate</b>"
|
||||||
|
(see Section 8.5.1, [dcl.init.aggr], of the C++ Standard). This would mean:</font></p>
|
||||||
|
<ul>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif" size="-1">An array can be initialized
|
||||||
|
with a brace-enclosing, comma-separated list of initializers for the elements
|
||||||
|
of the container, written in increasing subscript order:</font>
|
||||||
|
<blockquote>
|
||||||
|
<p><font face="Arial, Helvetica, sans-serif" size="-1">boost::array<int,4>
|
||||||
|
a = { { 1, 2, 3 } };</font></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><font face="Arial, Helvetica, sans-serif" size="-1">Note that if there
|
||||||
|
are fewer elements in the initializer list, then each remaining element
|
||||||
|
gets default-initialized (thus, it has a defined value).</font></p>
|
||||||
|
</li>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif" size="-1">However, <b>passing
|
||||||
|
no initializer list means that the elements have an indetermined initial value</b>.</font></li>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif" size="-1">It has no user-declared
|
||||||
|
constructors.</font></li>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif" size="-1">It has no private or
|
||||||
|
protected non-static data members.</font></li>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif" size="-1">It has no base classes.</font></li>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif" size="-1">It has no virtual functions.</font></li>
|
||||||
|
</ul>
|
||||||
|
<p><font face="Arial, Helvetica, sans-serif" size="-1">The current implementation
|
||||||
|
useus this approach. However, being able to have indetermined initial values
|
||||||
|
is a big drawback. So, please give me some feedback, how useful you consider
|
||||||
|
this feature to be. This leads to the list of <b>Open issues:</b></font>
|
||||||
|
<ul>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif">Do we want initializer list support
|
||||||
|
or would the following be OK?:</font>
|
||||||
|
<blockquote>
|
||||||
|
<p><font face="Courier New, Courier, mono">int data[] = { 1, 2, 3, 4 }</font></p>
|
||||||
|
<p><font face="Courier New, Courier, mono">array<int,5> x(data); <font face="Arial, Helvetica, sans-serif">or
|
||||||
|
</font> array<int,data> x;</font></p>
|
||||||
|
</blockquote>
|
||||||
|
</li>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif">Could "<font face="Courier New, Courier, mono">{
|
||||||
|
</font>...<font face="Courier New, Courier, mono"> }</font>" be used
|
||||||
|
portably instead of "<font face="Courier New, Courier, mono">{ { </font>...<font face="Courier New, Courier, mono">
|
||||||
|
} }</font>" to initialize values?</font> </li>
|
||||||
|
<blockquote>
|
||||||
|
<p><font face="Arial, Helvetica, sans-serif">8.5.1 (11) of the Standard seem
|
||||||
|
to allow it; however, gcc 2.95.2 printa warning message.</font></p>
|
||||||
|
</blockquote>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif">Any way to have determined initial
|
||||||
|
values and initializer list support?</font></li>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif">Static_casts for reverse iterator
|
||||||
|
stuff</font><font face="Arial, Helvetica, sans-serif">?</font></li>
|
||||||
|
</ul>
|
||||||
|
<p><font face="Arial, Helvetica, sans-serif">I'd appreciate any constructive <a href="mailto:solutions@josuttis.com">feedback</a>.
|
||||||
|
<b>Please note: I don't have time to read all boost mails. Thus, to make sure
|
||||||
|
that feedback arrives me, please send me a copy of each mail regarding this
|
||||||
|
class.</b></font>
|
||||||
|
<p><font face="Arial, Helvetica, sans-serif">The code is provided "as is" without
|
||||||
|
expressed or implied warranty.</font>
|
||||||
|
<p><font face="Arial, Helvetica, sans-serif"><b>array.hpp</b>, the implementation
|
||||||
|
of <font face="Courier New, Courier, mono">array<></font><b>:</b> </font>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif">
|
||||||
|
<a href="array.hpp.html">as HTML file</a></font></li>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif">
|
||||||
|
<a href="array.hpp">as plain file</a></font></li>
|
||||||
|
<p> <font face="Arial, Helvetica, sans-serif">Simple Example for using <font face="Courier New, Courier, mono">array<><font face="Arial, Helvetica, sans-serif">:</font></font></font>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif">
|
||||||
|
<a href="array1.cpp.html">as HTML file</a></font> </li>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif">
|
||||||
|
<a href="array1.cpp">as plain file</a></font></li>
|
||||||
|
<p> <font face="Arial, Helvetica, sans-serif">Another Example for using <font face="Courier New, Courier, mono">array<><font face="Arial, Helvetica, sans-serif">:</font></font></font>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif">
|
||||||
|
<a href="array2.cpp.html">as HTML file</a></font></li>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif">
|
||||||
|
<a href="array2.cpp">as plain file</a></font></li>
|
||||||
|
<p> <font face="Arial, Helvetica, sans-serif">A third Example for using <font face="Courier New, Courier, mono">array<><font face="Arial, Helvetica, sans-serif">:</font></font></font>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif">
|
||||||
|
<a href="array3.cpp.html">as HTML file</a></font></li>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif">
|
||||||
|
<a href="array3.cpp">as plain file</a></font></li>
|
||||||
|
<p> <font face="Arial, Helvetica, sans-serif">An Example for using <font face="Courier New, Courier, mono">array</font>s
|
||||||
|
of <font face="Courier New, Courier, mono">array</font>s<font face="Courier New, Courier, mono"><font face="Arial, Helvetica, sans-serif">:</font></font></font>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif"> <a href="array4.cpp.html">as HTML
|
||||||
|
file</a></font></li>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif"> <a href="array4.cpp">as plain file</a></font></li>
|
||||||
|
<p><font face="Arial, Helvetica, sans-serif">An Example for testing other operations
|
||||||
|
of <font face="Courier New, Courier, mono">array<></font><font face="Courier New, Courier, mono"><font face="Arial, Helvetica, sans-serif">:</font></font></font>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif"> <a href="array5.cpp.html">as HTML
|
||||||
|
file</a></font></li>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif"> <a href="array5.cpp">as plain file</a></font></li>
|
||||||
|
<p><b><font face="Arial, Helvetica, sans-serif">All files</font></b>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif"> <a href="array.zip">as ZIP file
|
||||||
|
(24KB)</a></font></li>
|
||||||
|
<li><font face="Arial, Helvetica, sans-serif"> <a href="array.tgz">as TGZ file
|
||||||
|
(13KB)</a><br>
|
||||||
|
<br>
|
||||||
|
To find more details about using ordinary arrays in C++ and the framework of
|
||||||
|
the STL, see e.g.</font> <font face="Arial, Helvetica, sans-serif"><br>
|
||||||
|
<i> <a href="http://www.josuttis.com/libbook/">The C++
|
||||||
|
Standard Library - A Tutorial and Reference</a></i> <br>
|
||||||
|
by <a href="http://www.josuttis.com" target="_top">Nicolai
|
||||||
|
M. Josuttis</a></font> <font face="Arial, Helvetica, sans-serif"><br>
|
||||||
|
Addison Wesley Longman, 1999</font> <font face="Arial, Helvetica, sans-serif"><br>
|
||||||
|
ISBN 0-201-37926-0</font> <font face="Arial, Helvetica, sans-serif"><br>
|
||||||
|
</font></li>
|
||||||
|
<p><font face="Arial, Helvetica, sans-serif"><a href="http://www.josuttis.com/" TARGET="_top">Home
|
||||||
|
Page of Nicolai Josuttis</a></font> <font face="Arial, Helvetica, sans-serif"><br>
|
||||||
|
</font>
|
||||||
|
</body>
|
||||||
|
</html>
|
46
array1.cpp
Normal file
46
array1.cpp
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/* simple example for using class array<>
|
||||||
|
*/
|
||||||
|
#include <iostream>
|
||||||
|
#include <boost/array.hpp>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// define special type name
|
||||||
|
typedef boost::array<float,6> Array;
|
||||||
|
|
||||||
|
// create and initialize an array
|
||||||
|
Array a = { { 42 } };
|
||||||
|
|
||||||
|
// access elements
|
||||||
|
for (unsigned i=1; i<a.size(); ++i) {
|
||||||
|
a[i] = a[i-1]+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// use some common STL container operations
|
||||||
|
std::cout << "size: " << a.size() << std::endl;
|
||||||
|
std::cout << "empty: " << std::boolalpha << a.empty() << std::endl;
|
||||||
|
std::cout << "max_size: " << a.max_size() << std::endl;
|
||||||
|
std::cout << "front: " << a.front() << std::endl;
|
||||||
|
std::cout << "back: " << a.back() << std::endl;
|
||||||
|
std::cout << "elems: ";
|
||||||
|
|
||||||
|
// iterate through all elements
|
||||||
|
for (Array::const_iterator pos=a.begin(); pos<a.end(); ++pos) {
|
||||||
|
std::cout << *pos << ' ';
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
// check copy constructor and assignment operator
|
||||||
|
Array b(a);
|
||||||
|
Array c;
|
||||||
|
c = a;
|
||||||
|
if (a==b && a==c) {
|
||||||
|
std::cout << "copy construction and copy assignment are OK"
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::cout << "copy construction and copy assignment are OK"
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
67
array1.cpp.html
Normal file
67
array1.cpp.html
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
<HTML>
|
||||||
|
<HEAD>
|
||||||
|
<TITLE>array1.cpp</TITLE>
|
||||||
|
</HEAD>
|
||||||
|
|
||||||
|
<BODY TEXT="#000000" BGCOLOR="#FFFFFF">
|
||||||
|
|
||||||
|
<TABLE HEIGHT=40 WIDTH="100%">
|
||||||
|
<TR> <TD ALIGN=LEFT WIDTH="100%" BGCOLOR="#DDDDDD">
|
||||||
|
<FONT face="Arial,Helvetica" size=+2><B>
|
||||||
|
array1.cpp
|
||||||
|
</B></FONT>
|
||||||
|
</TD></TR></TABLE><BR>
|
||||||
|
|
||||||
|
<BR><BR>
|
||||||
|
<TT>
|
||||||
|
<SPAN class="Source">
|
||||||
|
<Font color="0000FF" >/</FONT><I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* simple example for using class array<></FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >*/</FONT></I><BR>
|
||||||
|
#include <iostream><BR>
|
||||||
|
#include <<A href="./array.hpp.html">boost/array.hpp</A>><BR>
|
||||||
|
<BR>
|
||||||
|
int main()<BR>
|
||||||
|
{<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// define special type name</FONT></I><BR>
|
||||||
|
typedef boost::array<float,6> Array;<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// create and initialize an array</FONT></I><BR>
|
||||||
|
Array a = { { 42 } };<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// access elements</FONT></I><BR>
|
||||||
|
for (unsigned i=1; i<a.size(); ++i) {<BR>
|
||||||
|
a[i] = a[i-1]+1;<BR>
|
||||||
|
}<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// use some common STL container operations</FONT></I><BR>
|
||||||
|
std::cout << "size: " << a.size() << std::endl;<BR>
|
||||||
|
std::cout << "empty: " << std::boolalpha << a.empty() << std::endl;<BR>
|
||||||
|
std::cout << "max_size: " << a.max_size() << std::endl;<BR>
|
||||||
|
std::cout << "front: " << a.front() << std::endl;<BR>
|
||||||
|
std::cout << "back: " << a.back() << std::endl;<BR>
|
||||||
|
std::cout << "elems: ";<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// iterate through all elements</FONT></I><BR>
|
||||||
|
for (Array::const_iterator pos=a.begin(); pos<a.end(); ++pos) {<BR>
|
||||||
|
std::cout << *pos << ' ';<BR>
|
||||||
|
}<BR>
|
||||||
|
std::cout << std::endl;<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// check copy constructor and assignment operator</FONT></I><BR>
|
||||||
|
Array b(a);<BR>
|
||||||
|
Array c;<BR>
|
||||||
|
c = a;<BR>
|
||||||
|
if (a==b && a==c) {<BR>
|
||||||
|
std::cout << "copy construction and copy assignment are OK"<BR>
|
||||||
|
<< std::endl;<BR>
|
||||||
|
}<BR>
|
||||||
|
else {<BR>
|
||||||
|
std::cout << "copy construction and copy assignment are OK"<BR>
|
||||||
|
<< std::endl;<BR>
|
||||||
|
}<BR>
|
||||||
|
}<BR>
|
||||||
|
<BR>
|
||||||
|
</SPAN>
|
||||||
|
</TT>
|
||||||
|
</BODY>
|
||||||
|
</HTML>
|
33
array2.cpp
Normal file
33
array2.cpp
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/* example for using class array<>
|
||||||
|
*/
|
||||||
|
#include <algorithm>
|
||||||
|
#include <functional>
|
||||||
|
#include <boost/array.hpp>
|
||||||
|
#include "print.hpp"
|
||||||
|
using namespace std;
|
||||||
|
using namespace boost;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// create and initialize array
|
||||||
|
array<int,10> a = { { 1, 2, 3, 4, 5 } };
|
||||||
|
|
||||||
|
PRINT_ELEMENTS(a);
|
||||||
|
|
||||||
|
// modify elements directly
|
||||||
|
for (unsigned i=0; i<a.size(); ++i) {
|
||||||
|
++a[i];
|
||||||
|
}
|
||||||
|
PRINT_ELEMENTS(a);
|
||||||
|
|
||||||
|
// change order using an STL algorithm
|
||||||
|
reverse(a.begin(),a.end());
|
||||||
|
PRINT_ELEMENTS(a);
|
||||||
|
|
||||||
|
// negate elements using STL framework
|
||||||
|
transform(a.begin(),a.end(), // source
|
||||||
|
a.begin(), // destination
|
||||||
|
negate<int>()); // operation
|
||||||
|
PRINT_ELEMENTS(a);
|
||||||
|
}
|
||||||
|
|
54
array2.cpp.html
Normal file
54
array2.cpp.html
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<HTML>
|
||||||
|
<HEAD>
|
||||||
|
<TITLE>array2.cpp</TITLE>
|
||||||
|
</HEAD>
|
||||||
|
|
||||||
|
<BODY TEXT="#000000" BGCOLOR="#FFFFFF">
|
||||||
|
|
||||||
|
<TABLE HEIGHT=40 WIDTH="100%">
|
||||||
|
<TR> <TD ALIGN=LEFT WIDTH="100%" BGCOLOR="#DDDDDD">
|
||||||
|
<FONT face="Arial,Helvetica" size=+2><B>
|
||||||
|
array2.cpp
|
||||||
|
</B></FONT>
|
||||||
|
</TD></TR></TABLE><BR>
|
||||||
|
|
||||||
|
<BR><BR>
|
||||||
|
<TT>
|
||||||
|
<SPAN class="Source">
|
||||||
|
<Font color="0000FF" >/</FONT><I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* example for using class array<></FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >*/</FONT></I><BR>
|
||||||
|
#include <algorithm><BR>
|
||||||
|
#include <functional><BR>
|
||||||
|
#include <<A href="./array.hpp.html">boost/array.hpp</A>><BR>
|
||||||
|
#include "<A href="print.hpp.html">print.hpp</A>"<BR>
|
||||||
|
using namespace std;<BR>
|
||||||
|
using namespace boost;<BR>
|
||||||
|
<BR>
|
||||||
|
int main()<BR>
|
||||||
|
{<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// create and initialize array</FONT></I><BR>
|
||||||
|
array<int,10> a = { { 1, 2, 3, 4, 5 } };<BR>
|
||||||
|
<BR>
|
||||||
|
PRINT_ELEMENTS(a);<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// modify elements directly</FONT></I><BR>
|
||||||
|
for (unsigned i=0; i<a.size(); ++i) {<BR>
|
||||||
|
++a[i];<BR>
|
||||||
|
}<BR>
|
||||||
|
PRINT_ELEMENTS(a);<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// change order using an STL algorithm</FONT></I><BR>
|
||||||
|
reverse(a.begin(),a.end());<BR>
|
||||||
|
PRINT_ELEMENTS(a);<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// negate elements using STL framework</FONT></I><BR>
|
||||||
|
transform(a.begin(),a.end(), <I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// source</FONT></I><BR>
|
||||||
|
a.begin(), <I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// destination</FONT></I><BR>
|
||||||
|
negate<int>()); <I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// operation</FONT></I><BR>
|
||||||
|
PRINT_ELEMENTS(a);<BR>
|
||||||
|
}<BR>
|
||||||
|
<BR>
|
||||||
|
</SPAN>
|
||||||
|
</TT>
|
||||||
|
</BODY>
|
||||||
|
</HTML>
|
48
array3.cpp
Normal file
48
array3.cpp
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/* example for using class array<>
|
||||||
|
*/
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
#include <boost/array.hpp>
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void print_elements (const T& x);
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// create array of four seasons
|
||||||
|
boost::array<std::string,4> seasons = {
|
||||||
|
{ "spring", "summer", "autumn", "winter" }
|
||||||
|
};
|
||||||
|
|
||||||
|
// copy and change order
|
||||||
|
boost::array<std::string,4> seasons_orig = seasons;
|
||||||
|
for (unsigned i=seasons.size()-1; i>0; --i) {
|
||||||
|
swap(seasons.at(i),seasons.at((i+1)%seasons.size()));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "one way: ";
|
||||||
|
print_elements(seasons);
|
||||||
|
|
||||||
|
// try swap()
|
||||||
|
std::cout << "other way: ";
|
||||||
|
swap(seasons,seasons_orig);
|
||||||
|
print_elements(seasons);
|
||||||
|
|
||||||
|
// try reverse iterators
|
||||||
|
std::cout << "reverse: ";
|
||||||
|
for (boost::array<std::string,4>::reverse_iterator pos
|
||||||
|
=seasons.rbegin(); pos<seasons.rend(); ++pos) {
|
||||||
|
std::cout << " " << *pos;
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void print_elements (const T& x)
|
||||||
|
{
|
||||||
|
for (unsigned i=0; i<x.size(); ++i) {
|
||||||
|
std::cout << " " << x[i];
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
|
69
array3.cpp.html
Normal file
69
array3.cpp.html
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
<HTML>
|
||||||
|
<HEAD>
|
||||||
|
<TITLE>array3.cpp</TITLE>
|
||||||
|
</HEAD>
|
||||||
|
|
||||||
|
<BODY TEXT="#000000" BGCOLOR="#FFFFFF">
|
||||||
|
|
||||||
|
<TABLE HEIGHT=40 WIDTH="100%">
|
||||||
|
<TR> <TD ALIGN=LEFT WIDTH="100%" BGCOLOR="#DDDDDD">
|
||||||
|
<FONT face="Arial,Helvetica" size=+2><B>
|
||||||
|
array3.cpp
|
||||||
|
</B></FONT>
|
||||||
|
</TD></TR></TABLE><BR>
|
||||||
|
|
||||||
|
<BR><BR>
|
||||||
|
<TT>
|
||||||
|
<SPAN class="Source">
|
||||||
|
<Font color="0000FF" >/</FONT><I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* example for using class array<></FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >*/</FONT></I><BR>
|
||||||
|
#include <string><BR>
|
||||||
|
#include <iostream><BR>
|
||||||
|
#include <<A href="./array.hpp.html">boost/array.hpp</A>><BR>
|
||||||
|
<BR>
|
||||||
|
template <class T><BR>
|
||||||
|
void print_elements (const T& x);<BR>
|
||||||
|
<BR>
|
||||||
|
int main()<BR>
|
||||||
|
{<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// create array of four seasons</FONT></I><BR>
|
||||||
|
boost::array<std::string,4> seasons = {<BR>
|
||||||
|
{ "spring", "summer", "autumn", "winter" }<BR>
|
||||||
|
};<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// copy and change order</FONT></I><BR>
|
||||||
|
boost::array<std::string,4> seasons_orig = seasons;<BR>
|
||||||
|
for (unsigned i=seasons.size()-1; i>0; --i) {<BR>
|
||||||
|
swap(seasons.at(i),seasons.at((i+1)%seasons.size()));<BR>
|
||||||
|
}<BR>
|
||||||
|
<BR>
|
||||||
|
std::cout << "one way: ";<BR>
|
||||||
|
print_elements(seasons);<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// try swap()</FONT></I><BR>
|
||||||
|
std::cout << "other way: ";<BR>
|
||||||
|
swap(seasons,seasons_orig);<BR>
|
||||||
|
print_elements(seasons);<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// try reverse iterators</FONT></I><BR>
|
||||||
|
std::cout << "reverse: ";<BR>
|
||||||
|
for (boost::array<std::string,4>::reverse_iterator pos<BR>
|
||||||
|
=seasons.rbegin(); pos<seasons.rend(); ++pos) {<BR>
|
||||||
|
std::cout << " " << *pos;<BR>
|
||||||
|
}<BR>
|
||||||
|
std::cout << std::endl;<BR>
|
||||||
|
}<BR>
|
||||||
|
<BR>
|
||||||
|
template <class T><BR>
|
||||||
|
void print_elements (const T& x)<BR>
|
||||||
|
{<BR>
|
||||||
|
for (unsigned i=0; i<x.size(); ++i) {<BR>
|
||||||
|
std::cout << " " << x[i];<BR>
|
||||||
|
}<BR>
|
||||||
|
std::cout << std::endl;<BR>
|
||||||
|
}<BR>
|
||||||
|
<BR>
|
||||||
|
</SPAN>
|
||||||
|
</TT>
|
||||||
|
</BODY>
|
||||||
|
</HTML>
|
36
array4.cpp
Normal file
36
array4.cpp
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/* example for using class array<>
|
||||||
|
*/
|
||||||
|
#include <algorithm>
|
||||||
|
#include <functional>
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
#include <boost/array.hpp>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// array of arrays of seasons
|
||||||
|
boost::array<boost::array<std::string,4>,2> seasons_i18n = {
|
||||||
|
{ { { "spring", "summer", "autumn", "winter", } },
|
||||||
|
{ { "Fruehling", "Sommer", "Herbst", "Winter" } }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// for any array of seasons print seasons
|
||||||
|
for (unsigned i=0; i<seasons_i18n.size(); ++i) {
|
||||||
|
boost::array<std::string,4> seasons = seasons_i18n[i];
|
||||||
|
for (unsigned j=0; j<seasons.size(); ++j) {
|
||||||
|
std::cout << seasons[j] << " ";
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// print first element of first array
|
||||||
|
std::cout << "first element of first array: "
|
||||||
|
<< seasons_i18n[0][0] << std::endl;
|
||||||
|
|
||||||
|
// print last element of last array
|
||||||
|
std::cout << "last element of last array: "
|
||||||
|
<< seasons_i18n[seasons_i18n.size()-1][seasons_i18n[0].size()-1]
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
|
57
array4.cpp.html
Normal file
57
array4.cpp.html
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
<HTML>
|
||||||
|
<HEAD>
|
||||||
|
<TITLE>array4.cpp</TITLE>
|
||||||
|
</HEAD>
|
||||||
|
|
||||||
|
<BODY TEXT="#000000" BGCOLOR="#FFFFFF">
|
||||||
|
|
||||||
|
<TABLE HEIGHT=40 WIDTH="100%">
|
||||||
|
<TR> <TD ALIGN=LEFT WIDTH="100%" BGCOLOR="#DDDDDD">
|
||||||
|
<FONT face="Arial,Helvetica" size=+2><B>
|
||||||
|
array4.cpp
|
||||||
|
</B></FONT>
|
||||||
|
</TD></TR></TABLE><BR>
|
||||||
|
|
||||||
|
<BR><BR>
|
||||||
|
<TT>
|
||||||
|
<SPAN class="Source">
|
||||||
|
<Font color="0000FF" >/</FONT><I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* example for using class array<></FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >*/</FONT></I><BR>
|
||||||
|
#include <algorithm><BR>
|
||||||
|
#include <functional><BR>
|
||||||
|
#include <string><BR>
|
||||||
|
#include <iostream><BR>
|
||||||
|
#include <<A href="./array.hpp.html">boost/array.hpp</A>><BR>
|
||||||
|
<BR>
|
||||||
|
int main()<BR>
|
||||||
|
{<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// array of arrays of seasons</FONT></I><BR>
|
||||||
|
boost::array<boost::array<std::string,4>,2> seasons_i18n = {<BR>
|
||||||
|
{ { { "spring", "summer", "autumn", "winter", } },<BR>
|
||||||
|
{ { "Fruehling", "Sommer", "Herbst", "Winter" } }<BR>
|
||||||
|
}<BR>
|
||||||
|
};<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// for any array of seasons print seasons</FONT></I><BR>
|
||||||
|
for (unsigned i=0; i<seasons_i18n.size(); ++i) {<BR>
|
||||||
|
boost::array<std::string,4> seasons = seasons_i18n[i];<BR>
|
||||||
|
for (unsigned j=0; j<seasons.size(); ++j) {<BR>
|
||||||
|
std::cout << seasons[j] << " ";<BR>
|
||||||
|
}<BR>
|
||||||
|
std::cout << std::endl;<BR>
|
||||||
|
}<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// print first element of first array</FONT></I><BR>
|
||||||
|
std::cout << "first element of first array: "<BR>
|
||||||
|
<< seasons_i18n[0][0] << std::endl;<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// print last element of last array</FONT></I><BR>
|
||||||
|
std::cout << "last element of last array: "<BR>
|
||||||
|
<< seasons_i18n[seasons_i18n.size()-1][seasons_i18n[0].size()-1]<BR>
|
||||||
|
<< std::endl;<BR>
|
||||||
|
}<BR>
|
||||||
|
<BR>
|
||||||
|
</SPAN>
|
||||||
|
</TT>
|
||||||
|
</BODY>
|
||||||
|
</HTML>
|
64
array5.cpp
Normal file
64
array5.cpp
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/* simple example for using class array<>
|
||||||
|
*/
|
||||||
|
#include <iostream>
|
||||||
|
#include <boost/array.hpp>
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void test_static_size (const T& cont)
|
||||||
|
{
|
||||||
|
int tmp[T::static_size];
|
||||||
|
for (unsigned i=0; i<T::static_size; ++i) {
|
||||||
|
tmp[i] = int(cont[i]);
|
||||||
|
}
|
||||||
|
for (unsigned i=0; i<T::static_size; ++i) {
|
||||||
|
std::cout << tmp[i] << ' ';
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// define special type name
|
||||||
|
typedef boost::array<float,6> Array;
|
||||||
|
|
||||||
|
// create and initialize an array
|
||||||
|
const Array a = { { 42.42 } };
|
||||||
|
|
||||||
|
// use some common STL container operations
|
||||||
|
std::cout << "static_size: " << a.size() << std::endl;
|
||||||
|
std::cout << "size: " << a.size() << std::endl;
|
||||||
|
std::cout << "empty: " << std::boolalpha << a.empty() << std::endl;
|
||||||
|
std::cout << "max_size: " << a.max_size() << std::endl;
|
||||||
|
std::cout << "front: " << a.front() << std::endl;
|
||||||
|
std::cout << "back: " << a.back() << std::endl;
|
||||||
|
std::cout << "[0]: " << a[0] << std::endl;
|
||||||
|
std::cout << "elems: ";
|
||||||
|
|
||||||
|
// iterate through all elements
|
||||||
|
for (Array::const_iterator pos=a.begin(); pos<a.end(); ++pos) {
|
||||||
|
std::cout << *pos << ' ';
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
test_static_size(a);
|
||||||
|
|
||||||
|
// check copy constructor and assignment operator
|
||||||
|
Array b(a);
|
||||||
|
Array c;
|
||||||
|
c = a;
|
||||||
|
if (a==b && a==c) {
|
||||||
|
std::cout << "copy construction and copy assignment are OK"
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::cout << "copy construction and copy assignment are OK"
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef boost::array<double,6> DArray;
|
||||||
|
typedef boost::array<int,6> IArray;
|
||||||
|
IArray ia = { 1, 2, 3, 4, 5, 6 };
|
||||||
|
DArray da;
|
||||||
|
da = ia;
|
||||||
|
da.assign(42);
|
||||||
|
}
|
||||||
|
|
85
array5.cpp.html
Normal file
85
array5.cpp.html
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
<HTML>
|
||||||
|
<HEAD>
|
||||||
|
<TITLE>array5.cpp</TITLE>
|
||||||
|
</HEAD>
|
||||||
|
|
||||||
|
<BODY TEXT="#000000" BGCOLOR="#FFFFFF">
|
||||||
|
|
||||||
|
<TABLE HEIGHT=40 WIDTH="100%">
|
||||||
|
<TR> <TD ALIGN=LEFT WIDTH="100%" BGCOLOR="#DDDDDD">
|
||||||
|
<FONT face="Arial,Helvetica" size=+2><B>
|
||||||
|
array5.cpp
|
||||||
|
</B></FONT>
|
||||||
|
</TD></TR></TABLE><BR>
|
||||||
|
|
||||||
|
<BR><BR>
|
||||||
|
<TT>
|
||||||
|
<SPAN class="Source">
|
||||||
|
<Font color="0000FF" >/</FONT><I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* simple example for using class array<></FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >*/</FONT></I><BR>
|
||||||
|
#include <iostream><BR>
|
||||||
|
#include <<A href="./array.hpp.html">boost/array.hpp</A>><BR>
|
||||||
|
<BR>
|
||||||
|
template <typename T><BR>
|
||||||
|
void test_static_size (const T& cont)<BR>
|
||||||
|
{<BR>
|
||||||
|
int tmp[T::static_size];<BR>
|
||||||
|
for (unsigned i=0; i<T::static_size; ++i) {<BR>
|
||||||
|
tmp[i] = int(cont[i]);<BR>
|
||||||
|
}<BR>
|
||||||
|
for (unsigned i=0; i<T::static_size; ++i) {<BR>
|
||||||
|
std::cout << tmp[i] << ' ';<BR>
|
||||||
|
}<BR>
|
||||||
|
std::cout << std::endl;<BR>
|
||||||
|
}<BR>
|
||||||
|
<BR>
|
||||||
|
int main()<BR>
|
||||||
|
{<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// define special type name</FONT></I><BR>
|
||||||
|
typedef boost::array<float,6> Array;<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// create and initialize an array</FONT></I><BR>
|
||||||
|
const Array a = { { 42.42 } };<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// use some common STL container operations</FONT></I><BR>
|
||||||
|
std::cout << "static_size: " << a.size() << std::endl;<BR>
|
||||||
|
std::cout << "size: " << a.size() << std::endl;<BR>
|
||||||
|
std::cout << "empty: " << std::boolalpha << a.empty() << std::endl;<BR>
|
||||||
|
std::cout << "max_size: " << a.max_size() << std::endl;<BR>
|
||||||
|
std::cout << "front: " << a.front() << std::endl;<BR>
|
||||||
|
std::cout << "back: " << a.back() << std::endl;<BR>
|
||||||
|
std::cout << "[0]: " << a[0] << std::endl;<BR>
|
||||||
|
std::cout << "elems: ";<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// iterate through all elements</FONT></I><BR>
|
||||||
|
for (Array::const_iterator pos=a.begin(); pos<a.end(); ++pos) {<BR>
|
||||||
|
std::cout << *pos << ' ';<BR>
|
||||||
|
}<BR>
|
||||||
|
std::cout << std::endl;<BR>
|
||||||
|
test_static_size(a);<BR>
|
||||||
|
<BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >// check copy constructor and assignment operator</FONT></I><BR>
|
||||||
|
Array b(a);<BR>
|
||||||
|
Array c;<BR>
|
||||||
|
c = a;<BR>
|
||||||
|
if (a==b && a==c) {<BR>
|
||||||
|
std::cout << "copy construction and copy assignment are OK"<BR>
|
||||||
|
<< std::endl;<BR>
|
||||||
|
}<BR>
|
||||||
|
else {<BR>
|
||||||
|
std::cout << "copy construction and copy assignment are OK"<BR>
|
||||||
|
<< std::endl;<BR>
|
||||||
|
}<BR>
|
||||||
|
<BR>
|
||||||
|
typedef boost::array<double,6> DArray;<BR>
|
||||||
|
typedef boost::array<int,6> IArray;<BR>
|
||||||
|
IArray ia = { 1, 2, 3, 4, 5, 6 };<BR>
|
||||||
|
DArray da;<BR>
|
||||||
|
da = ia;<BR>
|
||||||
|
da.assign(42);<BR>
|
||||||
|
}<BR>
|
||||||
|
<BR>
|
||||||
|
</SPAN>
|
||||||
|
</TT>
|
||||||
|
</BODY>
|
||||||
|
</HTML>
|
@ -1,143 +1,157 @@
|
|||||||
// -*-C++-*- array.hpp
|
/* The following code declares class array,
|
||||||
// <!!---------------------------------------------------------------------->
|
* an STL container (as wrapper) for arrays of constant size.
|
||||||
// <!! Copyright (C) 1998 Dietmar Kuehl, Claas Solutions GmbH >
|
*
|
||||||
// <!!>
|
* See
|
||||||
// <!! Permission to use, copy, modify, distribute and sell this >
|
* http://www.josuttis.com/cppcode
|
||||||
// <!! software for any purpose is hereby granted without fee, provided >
|
* for details and the latest version.
|
||||||
// <!! that the above copyright notice appears in all copies and that >
|
*
|
||||||
// <!! both that copyright notice and this permission notice appear in >
|
* (C) Copyright Nicolai M. Josuttis 1999.
|
||||||
// <!! supporting documentation. Dietmar Kuehl and Claas Solutions make no >
|
* Permission to copy, use, modify, sell and distribute this software
|
||||||
// <!! representations about the suitability of this software for any >
|
* is granted provided this copyright notice appears in all copies.
|
||||||
// <!! purpose. It is provided "as is" without express or implied warranty. >
|
* This software is provided "as is" without express or implied
|
||||||
// <!!---------------------------------------------------------------------->
|
* warranty, and with no claim as to its suitability for any purpose.
|
||||||
|
*
|
||||||
// Author: Dietmar Kuehl dietmar.kuehl@claas-solutions.de
|
* Jul 31, 2000
|
||||||
// Title: STL container support, including support for built-in arrays
|
*/
|
||||||
// Version: $Id$
|
#ifndef BOOST_ARRAY_HPP
|
||||||
|
#define BOOST_ARRAY_HPP
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#if !defined(BOOST_ARRAY_HPP)
|
|
||||||
#define BOOST_ARRAY_HPP 1
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <iterator>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// BUG-FIX for compilers that don't support
|
||||||
|
// std::size_t and std::ptrdiff_t yet
|
||||||
|
// (such as gcc)
|
||||||
|
#include <boost/config.hpp>
|
||||||
|
|
||||||
namespace boost
|
namespace boost {
|
||||||
{
|
|
||||||
|
|
||||||
// --- a general version of container traits ------------------------------
|
template<class T, std::size_t N>
|
||||||
|
class array {
|
||||||
|
public:
|
||||||
|
T elems[N]; // fixed-size array of elements of type T
|
||||||
|
|
||||||
|
public:
|
||||||
|
// type definitions
|
||||||
|
typedef T value_type;
|
||||||
|
typedef T* iterator;
|
||||||
|
typedef const T* const_iterator;
|
||||||
|
typedef T& reference;
|
||||||
|
typedef const T& const_reference;
|
||||||
|
typedef std::size_t size_type;
|
||||||
|
typedef std::ptrdiff_t difference_type;
|
||||||
|
|
||||||
|
// iterator support
|
||||||
|
iterator begin() { return elems; }
|
||||||
|
const_iterator begin() const { return elems; }
|
||||||
|
iterator end() { return elems+N; }
|
||||||
|
const_iterator end() const { return elems+N; }
|
||||||
|
|
||||||
|
// reverse iterator support
|
||||||
|
# if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
|
||||||
|
typedef std::reverse_iterator<iterator> reverse_iterator;
|
||||||
|
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
|
||||||
|
# else
|
||||||
|
// workaround for broken reverse_iterator implementations due to no partial specialization
|
||||||
|
typedef std::reverse_iterator<iterator,T> reverse_iterator;
|
||||||
|
typedef std::reverse_iterator<const_iterator,T> const_reverse_iterator;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
reverse_iterator rbegin() { return reverse_iterator(end()); }
|
||||||
|
const_reverse_iterator rbegin() const {
|
||||||
|
return const_reverse_iterator(end());
|
||||||
|
}
|
||||||
|
reverse_iterator rend() { return reverse_iterator(begin()); }
|
||||||
|
const_reverse_iterator rend() const {
|
||||||
|
return const_reverse_iterator(begin());
|
||||||
|
}
|
||||||
|
|
||||||
|
// operator[]
|
||||||
|
reference operator[](size_type i) { return elems[i]; }
|
||||||
|
const_reference operator[](size_type i) const { return elems[i]; }
|
||||||
|
|
||||||
|
// at() with range check
|
||||||
|
reference at(size_type i) { rangecheck(i); return elems[i]; }
|
||||||
|
const_reference at(size_type i) const { rangecheck(i); return elems[i]; }
|
||||||
|
|
||||||
|
// front() and back()
|
||||||
|
reference front() { return elems[0]; }
|
||||||
|
const_reference front() const { return elems[0]; }
|
||||||
|
reference back() { return elems[N-1]; }
|
||||||
|
const_reference back() const { return elems[N-1]; }
|
||||||
|
|
||||||
|
// size is constant
|
||||||
|
static size_type size() { return N; }
|
||||||
|
static bool empty() { return false; }
|
||||||
|
static size_type max_size() { return N; }
|
||||||
|
enum { static_size = N };
|
||||||
|
|
||||||
|
public:
|
||||||
|
// swap (note: linear complexity)
|
||||||
|
void swap (array<T,N>& y) {
|
||||||
|
std::swap_ranges(begin(),end(),y.begin());
|
||||||
|
}
|
||||||
|
|
||||||
|
// direct access to data
|
||||||
|
const T* data() const { return elems; }
|
||||||
|
|
||||||
|
// assignment with type conversion
|
||||||
|
template <typename T2>
|
||||||
|
array<T,N>& operator= (const array<T2,N>& rhs) {
|
||||||
|
std::copy(rhs.begin(),rhs.end(), begin());
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// assign one value to all elements
|
||||||
|
void assign (const T& value)
|
||||||
|
{
|
||||||
|
std::fill_n(begin(),size(),value);
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifndef BOOST_NO_PRIVATE_IN_AGGREGATE
|
||||||
|
private:
|
||||||
|
# endif
|
||||||
|
// private member functions are allowed in aggregates [ISO 8.5.1]
|
||||||
|
static void rangecheck (size_type i) {
|
||||||
|
if (i >= size()) { throw std::range_error("array"); }
|
||||||
|
}
|
||||||
|
|
||||||
template <typename Cont>
|
|
||||||
struct array_traits
|
|
||||||
{
|
|
||||||
typedef typename Cont::iterator iter_type;
|
|
||||||
typedef typename Cont::size_type size_type;
|
|
||||||
static iter_type begin(Cont &cont) { return cont.begin(); }
|
|
||||||
static iter_type end(Cont &cont) { return cont.end(); }
|
|
||||||
static size_type size(Cont &cont) { return cont.size(); }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// --- a version of container traits for constant constainer --------------
|
// comparisons
|
||||||
|
template<class T, std::size_t N>
|
||||||
|
bool operator== (const array<T,N>& x, const array<T,N>& y) {
|
||||||
|
return std::equal(x.begin(), x.end(), y.begin());
|
||||||
|
}
|
||||||
|
template<class T, std::size_t N>
|
||||||
|
bool operator< (const array<T,N>& x, const array<T,N>& y) {
|
||||||
|
return std::lexicographical_compare(x.begin(),x.end(),y.begin(),y.end());
|
||||||
|
}
|
||||||
|
template<class T, std::size_t N>
|
||||||
|
bool operator!= (const array<T,N>& x, const array<T,N>& y) {
|
||||||
|
return !(x==y);
|
||||||
|
}
|
||||||
|
template<class T, std::size_t N>
|
||||||
|
bool operator> (const array<T,N>& x, const array<T,N>& y) {
|
||||||
|
return y<x;
|
||||||
|
}
|
||||||
|
template<class T, std::size_t N>
|
||||||
|
bool operator<= (const array<T,N>& x, const array<T,N>& y) {
|
||||||
|
return !(y<x);
|
||||||
|
}
|
||||||
|
template<class T, std::size_t N>
|
||||||
|
bool operator>= (const array<T,N>& x, const array<T,N>& y) {
|
||||||
|
return !(x<y);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename Cont>
|
// global swap()
|
||||||
struct array_traits<Cont const>
|
template<class T, std::size_t N>
|
||||||
{
|
inline void swap (array<T,N>& x, array<T,N>& y) {
|
||||||
typedef typename Cont::const_iterator iter_type;
|
x.swap(y);
|
||||||
typedef typename Cont::size_type size_type;
|
}
|
||||||
static iter_type begin(Cont const &cont) { return cont.begin(); }
|
|
||||||
static iter_type end(Cont const &cont) { return cont.end(); }
|
|
||||||
static size_type size(Cont const &cont) { return cont.size(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
// --- a special version for non-const built-in arrays --------------------
|
} /* namespace boost */
|
||||||
|
|
||||||
template <typename T, size_t sz>
|
#endif /*BOOST_ARRAY_HPP*/
|
||||||
struct array_traits<T[sz]>
|
|
||||||
{
|
|
||||||
typedef T* iter_type;
|
|
||||||
typedef size_t size_type;
|
|
||||||
static iter_type begin(T (&array)[sz]) { return array; }
|
|
||||||
static iter_type end(T (&array)[sz]) { return array + sz; }
|
|
||||||
static size_type size(T (&)[sz]) { return sz; }
|
|
||||||
};
|
|
||||||
|
|
||||||
// --- a special version for const built-in arrays ------------------------
|
|
||||||
|
|
||||||
template <typename T, size_t sz>
|
|
||||||
struct array_traits<T const[sz]>
|
|
||||||
{
|
|
||||||
typedef T const* iter_type;
|
|
||||||
typedef size_t size_type;
|
|
||||||
static iter_type begin(T const (&array)[sz]) { return array; }
|
|
||||||
static iter_type end(T const (&array)[sz]) { return array + sz; }
|
|
||||||
static size_type size(T const (&array)[sz]) { return sz; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, int sz>
|
|
||||||
inline char (&sizer(T (&)[sz]))[sz];
|
|
||||||
|
|
||||||
// --- general version of the global accessor functions ---------------------
|
|
||||||
|
|
||||||
template <typename Cont>
|
|
||||||
inline typename array_traits<Cont>::iter_type
|
|
||||||
begin(Cont &cont) { return array_traits<Cont>::begin(cont); }
|
|
||||||
|
|
||||||
template <typename Cont>
|
|
||||||
inline typename array_traits<Cont>::iter_type
|
|
||||||
end(Cont &cont) { return array_traits<Cont>::end(cont); }
|
|
||||||
|
|
||||||
template <typename Cont>
|
|
||||||
inline typename array_traits<Cont>::size_type
|
|
||||||
size(Cont &cont) { return array_traits<Cont>::size(cont); }
|
|
||||||
|
|
||||||
// --- Actually the above should be sufficient but compilers seem -----------
|
|
||||||
// --- to welcome some help. So here we go:
|
|
||||||
|
|
||||||
template <typename T, size_t sz>
|
|
||||||
inline typename array_traits<T[sz]>::iter_type
|
|
||||||
begin(T (&a)[sz]) { return array_traits<T[sz]>::begin(a); }
|
|
||||||
|
|
||||||
template <typename T, size_t sz>
|
|
||||||
inline typename array_traits<T[sz]>::iter_type
|
|
||||||
end(T (&a)[sz]) { return array_traits<T[sz]>::end(a); }
|
|
||||||
|
|
||||||
template <typename T, size_t sz>
|
|
||||||
inline typename array_traits<T[sz]>::size_type
|
|
||||||
size(T (&a)[sz]) { return array_traits<T[sz]>::size(a); }
|
|
||||||
|
|
||||||
// --- Apparently the compilers also need some specific help, ---------------
|
|
||||||
|
|
||||||
// --- EDG-2.39 wants to pass around pointers in some contexts --------------
|
|
||||||
#ifdef __EDG__
|
|
||||||
template <typename T>
|
|
||||||
struct array_traits<T*>
|
|
||||||
{
|
|
||||||
typedef T* iter_type;
|
|
||||||
typedef size_t size_type;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// --- egcs-1998-11-22 apparently likes an extra const version: -------------
|
|
||||||
#ifdef __GNUG__
|
|
||||||
template <typename T, size_t sz>
|
|
||||||
inline typename array_traits<T const[sz]>::iter_type
|
|
||||||
begin(T const(&a)[sz]) { return array_traits<T const[sz]>::begin(a); }
|
|
||||||
|
|
||||||
template <typename T, size_t sz>
|
|
||||||
inline typename array_traits<T const[sz]>::iter_type
|
|
||||||
end(T const(&a)[sz]) { return array_traits<T const[sz]>::end(a); }
|
|
||||||
|
|
||||||
template <typename T, size_t sz>
|
|
||||||
inline typename array_traits<T const[sz]>::size_type
|
|
||||||
size(T const (&a)[sz]) { return array_traits<T const[sz]>::size(a); }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#endif /* BOOST_ARRAY_HPP */
|
|
||||||
|
36
index.htm
Normal file
36
index.htm
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
|
||||||
|
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
|
||||||
|
<meta name="ProgId" content="FrontPage.Editor.Document">
|
||||||
|
<title>Array Wrapper Libary</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body bgcolor="#FFFFFF" text="#000000">
|
||||||
|
|
||||||
|
<table border="1" bgcolor="#007F7F" cellpadding="2">
|
||||||
|
<tr>
|
||||||
|
<td bgcolor="#FFFFFF"><img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)" width="277" height="86"></td>
|
||||||
|
<td><a href="../../index.htm"><font face="Arial" color="#FFFFFF"><big>Home</big></font></a></td>
|
||||||
|
<td><a href="../../libraries.htm"><font face="Arial" color="#FFFFFF"><big>Libraries</big></font></a></td>
|
||||||
|
<td><a href="../../people.htm"><font face="Arial" color="#FFFFFF"><big>People</big></font></a></td>
|
||||||
|
<td><a href="../../more/faq.htm"><font face="Arial" color="#FFFFFF"><big>FAQ</big></font></a></td>
|
||||||
|
<td><a href="../../more/index.htm"><font face="Arial" color="#FFFFFF"><big>More</big></font></a></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<h1>Array wrapper library</h1>
|
||||||
|
<p>The header array.hpp provides an STL compliant container wrapper for arrays
|
||||||
|
of constant size.
|
||||||
|
<ul>
|
||||||
|
<li><a href="array.htm">Documentation</a> (HTML).</li>
|
||||||
|
<li>Header <a href="../../boost/array.hpp">array.hpp</a></li>
|
||||||
|
<li>See docs for links to example programs.</li>
|
||||||
|
<li>Download <a href="../../boost_all.zip">all of Boost</a> (ZIP format).</li>
|
||||||
|
<li>Submitted by <a href="http://www.josuttis.com">Nicolai M. Josuttis</a>.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Revised <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %b %Y" startspan -->02 Aug 2000<!--webbot bot="Timestamp" endspan i-checksum="14748" --></p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
28
print.hpp
Normal file
28
print.hpp
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/* The following code example is taken from the book
|
||||||
|
* "The C++ Standard Library - A Tutorial and Reference"
|
||||||
|
* by Nicolai M. Josuttis, Addison-Wesley, 1999
|
||||||
|
*
|
||||||
|
* (C) Copyright Nicolai M. Josuttis 1999.
|
||||||
|
* Permission to copy, use, modify, sell and distribute this software
|
||||||
|
* is granted provided this copyright notice appears in all copies.
|
||||||
|
* This software is provided "as is" without express or implied
|
||||||
|
* warranty, and with no claim as to its suitability for any purpose.
|
||||||
|
*/
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
/* PRINT_ELEMENTS()
|
||||||
|
* - prints optional C-string optcstr followed by
|
||||||
|
* - all elements of the collection coll
|
||||||
|
* - separated by spaces
|
||||||
|
*/
|
||||||
|
template <class T>
|
||||||
|
inline void PRINT_ELEMENTS (const T& coll, const char* optcstr="")
|
||||||
|
{
|
||||||
|
typename T::const_iterator pos;
|
||||||
|
|
||||||
|
std::cout << optcstr;
|
||||||
|
for (pos=coll.begin(); pos!=coll.end(); ++pos) {
|
||||||
|
std::cout << *pos << ' ';
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
48
print.hpp.html
Normal file
48
print.hpp.html
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
<HTML>
|
||||||
|
<HEAD>
|
||||||
|
<TITLE>PRINT_ELEMENTS()</TITLE>
|
||||||
|
</HEAD>
|
||||||
|
|
||||||
|
<BODY TEXT="#000000" BGCOLOR="#FFFFFF">
|
||||||
|
|
||||||
|
<TABLE HEIGHT=40 WIDTH="100%">
|
||||||
|
<TR> <TD ALIGN=LEFT WIDTH="100%" BGCOLOR="#DDDDDD">
|
||||||
|
<FONT face="Arial,Helvetica" size=+2><B>
|
||||||
|
PRINT_ELEMENTS()
|
||||||
|
</B></FONT>
|
||||||
|
</TD></TR></TABLE><BR>
|
||||||
|
|
||||||
|
<FONT face="Arial,Helvetica"><B>
|
||||||
|
The following code example is taken from the book<BR>
|
||||||
|
<A HREF="http://www.josuttis.com/libbook/" TARGET="_top">
|
||||||
|
The C++ Standard Library - A Tutorial and Reference</A><BR>
|
||||||
|
by Nicolai M. Josuttis, Addison-Wesley, 1999<BR>
|
||||||
|
<A HREF="http://www.josuttis.com/libbook/copyright.html">
|
||||||
|
© Copyright</A> Nicolai M. Josuttis 1999<BR>
|
||||||
|
</B></FONT>
|
||||||
|
|
||||||
|
<BR><BR>
|
||||||
|
<TT>
|
||||||
|
<SPAN class="Source">
|
||||||
|
#include <iostream><BR>
|
||||||
|
<BR>
|
||||||
|
<Font color="0000FF" >/</FONT><I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* PRINT_ELEMENTS()</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* - prints optional C-string optcstr followed by</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* - all elements of the collection coll</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >* - separated by spaces</FONT></I><BR>
|
||||||
|
<I><FONT face="Arial,Helvetica,sans-serif" color="0000FF" >*/</FONT></I><BR>
|
||||||
|
template <class T><BR>
|
||||||
|
inline void PRINT_ELEMENTS (const T& coll, const char* optcstr="")<BR>
|
||||||
|
{<BR>
|
||||||
|
typename T::const_iterator pos;<BR>
|
||||||
|
<BR>
|
||||||
|
std::cout << optcstr;<BR>
|
||||||
|
for (pos=coll.begin(); pos!=coll.end(); ++pos) {<BR>
|
||||||
|
std::cout << *pos << ' ';<BR>
|
||||||
|
}<BR>
|
||||||
|
std::cout << std::endl;<BR>
|
||||||
|
}<BR>
|
||||||
|
</SPAN>
|
||||||
|
</TT>
|
||||||
|
</BODY>
|
||||||
|
</HTML>
|
Reference in New Issue
Block a user