Squashed 'third_party/boostorg/multi_array/' content from commit abcb283

Change-Id: I4b93f75f0b15b00216d918bd6db5fc4fcb9c4cc2
git-subtree-dir: third_party/boostorg/multi_array
git-subtree-split: abcb2839d56669d1b5bb8a240ec644f47c66beb2
diff --git a/include/boost/multi_array/concept_checks.hpp b/include/boost/multi_array/concept_checks.hpp
new file mode 100644
index 0000000..9f70ae1
--- /dev/null
+++ b/include/boost/multi_array/concept_checks.hpp
@@ -0,0 +1,221 @@
+// Copyright 2002 The Trustees of Indiana University.
+
+// Use, modification and distribution is subject to 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)
+
+//  Boost.MultiArray Library
+//  Authors: Ronald Garcia
+//           Jeremy Siek
+//           Andrew Lumsdaine
+//  See http://www.boost.org/libs/multi_array for documentation.
+
+#ifndef BOOST_MULTI_ARRAY_CONCEPT_CHECKS_RG110101_HPP
+#define BOOST_MULTI_ARRAY_CONCEPT_CHECKS_RG110101_HPP
+
+//
+// concept-checks.hpp - Checks out Const MultiArray and MultiArray
+// concepts
+//
+
+#include "boost/concept_check.hpp"
+#include "boost/iterator/iterator_concepts.hpp"
+
+namespace boost {
+namespace multi_array_concepts {
+
+namespace detail {
+  //
+  // idgen_helper -
+  //   This is a helper for generating index_gen instantiations with
+  //   the right type in order to test the call to
+  //   operator[](index_gen).  Since one would normally write:
+  //      A[ indices[range1][range2] ]; // or
+  //      B[ indices[index1][index2][range1] ];
+  //   idgen helper allows us to generate the "indices" type by
+  //   creating it through recursive calls.
+  template <std::size_t N>
+  struct idgen_helper {
+
+    template <typename Array, typename IdxGen, typename Call_Type>
+    static void call(Array& a, const IdxGen& idgen, Call_Type c) {
+      idgen_helper<N-1>::call(a,idgen[c],c);
+    }
+  };
+
+  template <>
+  struct idgen_helper<0> {
+
+    template <typename Array, typename IdxGen, typename Call_Type>
+    static void call(Array& a, const IdxGen& idgen, Call_Type) {
+      a[ idgen ];
+    }
+  };
+
+} // namespace detail
+
+
+  template <typename Array, std::size_t NumDims >
+  struct ConstMultiArrayConcept
+  {
+    void constraints() {
+    //    function_requires< CopyConstructibleConcept<Array> >();
+    function_requires< boost_concepts::ForwardTraversalConcept<iterator> >();
+    function_requires< boost_concepts::ReadableIteratorConcept<iterator> >();
+    function_requires< boost_concepts::ForwardTraversalConcept<const_iterator> >();
+    function_requires< boost_concepts::ReadableIteratorConcept<const_iterator> >();
+
+      // RG - a( CollectionArchetype) when available...
+      a[ id ];
+      // Test slicing, keeping only the first dimension, losing the rest
+      detail::idgen_helper<NumDims-1>::call(a,idgen[range],id);
+
+      // Test slicing, keeping all dimensions.
+      detail::idgen_helper<NumDims-1>::call(a,idgen[range],range);
+
+      st = a.size();
+      st = a.num_dimensions();
+      st = Array::dimensionality;
+      st = a.num_elements();
+      stp = a.shape();
+      idp = a.strides();
+      idp = a.index_bases();
+      cit = a.begin();
+      cit = a.end();
+      crit = a.rbegin();
+      crit = a.rend();
+      eltp = a.origin();
+    }
+
+    typedef typename Array::value_type value_type;
+    typedef typename Array::reference reference;
+    typedef typename Array::const_reference const_reference;
+    typedef typename Array::size_type size_type;
+    typedef typename Array::difference_type difference_type;
+    typedef typename Array::iterator iterator;
+    typedef typename Array::const_iterator const_iterator;
+    typedef typename Array::reverse_iterator reverse_iterator;
+    typedef typename Array::const_reverse_iterator const_reverse_iterator;
+    typedef typename Array::element element;
+    typedef typename Array::index index;
+    typedef typename Array::index_gen index_gen;
+    typedef typename Array::index_range index_range;
+    typedef typename Array::extent_gen extent_gen;
+    typedef typename Array::extent_range extent_range;
+
+    Array a;
+    size_type st;
+    const size_type* stp;
+    index id;
+    const index* idp;
+    const_iterator cit;
+    const_reverse_iterator crit;
+    const element* eltp;
+    index_gen idgen;
+    index_range range;
+  };
+
+
+  template <typename Array, std::size_t NumDims >
+  struct MutableMultiArrayConcept
+  {
+    void constraints() {
+      //    function_requires< CopyConstructibleConcept<Array> >();
+
+      function_requires< boost_concepts::ForwardTraversalConcept<iterator> >();
+      function_requires< boost_concepts::ReadableIteratorConcept<iterator> >();
+      function_requires< boost_concepts::WritableIteratorConcept<iterator> >();
+      function_requires< boost_concepts::ForwardTraversalConcept<const_iterator> >();
+      function_requires< boost_concepts::ReadableIteratorConcept<const_iterator> >();
+      function_requires< boost::OutputIterator<iterator,value_type> >();
+      
+      // RG - a( CollectionArchetype) when available...
+      value_type vt = a[ id ];
+
+      // Test slicing, keeping only the first dimension, losing the rest
+      detail::idgen_helper<NumDims-1>::call(a,idgen[range],id);
+
+      // Test slicing, keeping all dimensions.
+      detail::idgen_helper<NumDims-1>::call(a,idgen[range],range);
+
+      st = a.size();
+      st = a.num_dimensions();
+      st = a.num_elements();
+      stp = a.shape();
+      idp = a.strides();
+      idp = a.index_bases();
+      it = a.begin();
+      it = a.end();
+      rit = a.rbegin();
+      rit = a.rend();
+      eltp = a.origin();
+      const_constraints(a);
+    }
+
+    void const_constraints(const Array& a) {
+
+      //      value_type vt = a[ id ];
+
+      // Test slicing, keeping only the first dimension, losing the rest
+      detail::idgen_helper<NumDims-1>::call(a,idgen[range],id);
+
+      // Test slicing, keeping all dimensions.
+      detail::idgen_helper<NumDims-1>::call(a,idgen[range],range);
+
+      st = a.size();
+      st = a.num_dimensions();
+      st = a.num_elements();
+      stp = a.shape();
+      idp = a.strides();
+      idp = a.index_bases();
+      cit = a.begin();
+      cit = a.end();
+      crit = a.rbegin();
+      crit = a.rend();
+      eltp = a.origin();
+    }
+
+    typedef typename Array::value_type value_type;
+    typedef typename Array::reference reference;
+    typedef typename Array::const_reference const_reference;
+    typedef typename Array::size_type size_type;
+    typedef typename Array::difference_type difference_type;
+    typedef typename Array::iterator iterator;
+    typedef typename Array::const_iterator const_iterator;
+    typedef typename Array::reverse_iterator reverse_iterator;
+    typedef typename Array::const_reverse_iterator const_reverse_iterator;
+    typedef typename Array::element element;
+    typedef typename Array::index index;
+    typedef typename Array::index_gen index_gen;
+    typedef typename Array::index_range index_range;
+    typedef typename Array::extent_gen extent_gen;
+    typedef typename Array::extent_range extent_range;
+
+    Array a;
+    size_type st;
+    const size_type* stp;
+    index id;
+    const index* idp;
+    iterator it;
+    const_iterator cit;
+    reverse_iterator rit;
+    const_reverse_iterator crit;
+    const element* eltp;
+    index_gen idgen;
+    index_range range;
+  };
+
+
+} // namespace multi_array
+
+namespace detail {
+  namespace multi_array { // Old locations for these
+    using boost::multi_array_concepts::ConstMultiArrayConcept;
+    using boost::multi_array_concepts::MutableMultiArrayConcept;
+  }
+}
+
+} // namespace boost
+
+
+#endif // BOOST_MULTI_ARRAY_CONCEPT_CHECKS_RG110101_HPP