]> git.lyx.org Git - lyx.git/blobdiff - boost/boost/array.hpp
Delete all .cvsignore files from trunk
[lyx.git] / boost / boost / array.hpp
index 12621f744446bc559c16fdfbbfcbab1f37d2054a..ce9eda7b53362c1bfd6b4f16de5c65250f3752bb 100644 (file)
@@ -4,27 +4,38 @@
  * See
  *      http://www.josuttis.com/cppcode
  * for details and the latest version.
+ * See
+ *      http://www.boost.org/libs/array for Documentation.
+ * for documentation.
  *
- * (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.
+ * (C) Copyright Nicolai M. Josuttis 2001.
+ * 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)
  *
+ * 29 Jan 2004 - c_array() added, BOOST_NO_PRIVATE_IN_AGGREGATE removed (Nico Josuttis)
+ * 23 Aug 2002 - fix for Non-MSVC compilers combined with MSVC libraries.
+ * 05 Aug 2001 - minor update (Nico Josuttis)
  * 20 Jan 2001 - STLport fix (Beman Dawes)
  * 29 Sep 2000 - Initial Revision (Nico Josuttis)
+ *
+ * Jan 29, 2004
  */
 #ifndef BOOST_ARRAY_HPP
 #define BOOST_ARRAY_HPP
 
 #include <cstddef>
 #include <stdexcept>
-#include <iterator>
+#include <boost/assert.hpp>
+
+// Handles broken standard libraries better than <iterator>
+#include <boost/detail/iterator.hpp>
 #include <algorithm>
 
 // FIXES for broken compilers
 #include <boost/config.hpp>
 
+
 namespace boost {
 
     template<class T, std::size_t N>
@@ -49,9 +60,15 @@ namespace boost {
         const_iterator end() const { return elems+N; }
 
         // reverse iterator support
-#if    !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR)
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS)
         typedef std::reverse_iterator<iterator> 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;
 #else
         // workaround for broken reverse_iterator implementations
         typedef std::reverse_iterator<iterator,T> reverse_iterator;
@@ -68,18 +85,42 @@ namespace boost {
         }
 
         // operator[]
-        reference operator[](size_type i) { return elems[i]; }
-        const_reference operator[](size_type i) const { return elems[i]; }
+        reference operator[](size_type i) 
+        { 
+            BOOST_ASSERT( i < N && "out of range" ); 
+            return elems[i];
+        }
+        
+        const_reference operator[](size_type i) const 
+        {     
+            BOOST_ASSERT( i < N && "out of range" ); 
+            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]; }
+        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; }
@@ -92,9 +133,12 @@ namespace boost {
             std::swap_ranges(begin(),end(),y.begin());
         }
 
-        // direct access to data
+        // direct access to data (read-only)
         const T* data() const { return elems; }
 
+        // use array as C array (direct read/write access to data)
+        T* c_array() { return elems; }
+
         // assignment with type conversion
         template <typename T2>
         array<T,N>& operator= (const array<T2,N>& rhs) {
@@ -108,12 +152,11 @@ namespace boost {
             std::fill_n(begin(),size(),value);
         }
 
-#ifndef BOOST_NO_PRIVATE_IN_AGGREGATE
-      private:
-#endif
         // check range (may be private because it is static)
         static void rangecheck (size_type i) {
-            if (i >= size()) { throw std::range_error("array"); }
+            if (i >= size()) { 
+                throw std::range_error("array<>: index out of range");
+            }
         }
 
     };