# `multi_array_ref`

`multi_array_ref` is a multi-dimensional container adaptor. It provides the MultiArray interface over any contiguous block of elements. `multi_array_ref` exports the same interface as `multi_array`, with the exception of the constructors.

## Model Of.

`multi_array_ref` models MultiArray, CopyConstructible. and depending on the element type, it may also model EqualityComparable and LessThanComparable. Detailed descriptions are provided here only for operations that are not described in the `multi_array` reference.

## Synopsis

    namespace boost {

    template <typename ValueType,
              std::size_t NumDims>
    class multi_array_ref {
    public:
    // types:
      typedef ValueType                             element;
      typedef *unspecified*                         value_type;
      typedef *unspecified*                         reference;
      typedef *unspecified*                         const_reference;
      typedef *unspecified*                         difference_type;
      typedef *unspecified*                         iterator;
      typedef *unspecified*                         const_iterator;
      typedef *unspecified*                         reverse_iterator;
      typedef *unspecified*                         const_reverse_iterator;
      typedef multi_array_types::size_type          size_type;
      typedef multi_array_types::index              index;
      typedef multi_array_types::index_gen          index_gen;
      typedef multi_array_types::index_range        index_range;
      typedef multi_array_types::extent_gen         extent_gen;
      typedef multi_array_types::extent_range       extent_range;
      typedef *unspecified*                         storage_order_type;

      // template typedefs
      template <std::size_t Dims> struct            subarray;
      template <std::size_t Dims> struct            const_subarray;
      template <std::size_t Dims> struct            array_view;
      template <std::size_t Dims> struct            const_array_view;

      static const std::size_t dimensionality = NumDims;

      // constructors and destructors

      template <typename ExtentList>
      explicit multi_array_ref(element* data, const ExtentList& sizes,
                           const storage_order_type& store = c_storage_order());
      explicit multi_array_ref(element* data, const extents_tuple& ranges,
                           const storage_order_type& store = c_storage_order());
      multi_array_ref(const multi_array_ref& x);
      ~multi_array_ref();

      // modifiers

      multi_array_ref& operator=(const multi_array_ref& x);
      template <class Array> multi_array_ref& operator=(const Array& x);

      // iterators:
      iterator				begin();
      iterator				end();
      const_iterator			begin() const;
      const_iterator			end() const;
      reverse_iterator			rbegin();
      reverse_iterator			rend();
      const_reverse_iterator		rbegin() const;
      const_reverse_iterator		rend() const;

      // capacity:
      size_type				size() const;
      size_type				num_elements() const;
      size_type				num_dimensions() const;

      // element access:
      template <typename IndexList>
        element&			operator()(const IndexList& indices);
      template <typename IndexList>
        const element&		operator()(const IndexList& indices) const;
      reference			operator[](index i);
      const_reference		operator[](index i) const;
      array_view<Dims>::type	operator[](const indices_tuple& r);
      const_array_view<Dims>::type	operator[](const indices_tuple& r) const;

      // queries
      element*			data();
      const element*		data() const;
      element*			origin();
      const element*		origin() const;
      const size_type*		shape() const;
      const index*			strides() const;
      const index*			index_bases() const;
      const storage_order_type&     storage_order() const;

      // comparators
      bool operator==(const multi_array_ref& rhs);
      bool operator!=(const multi_array_ref& rhs);
      bool operator<(const multi_array_ref& rhs);
      bool operator>(const multi_array_ref& rhs);
      bool operator>=(const multi_array_ref& rhs);
      bool operator<=(const multi_array_ref& rhs);

      // modifiers:
      template <typename InputIterator>
        void			assign(InputIterator begin, InputIterator end);
      template <typename SizeList>
        void			reshape(const SizeList& sizes)
      template <typename BaseList>	void reindex(const BaseList& values);
      void				reindex(index value);
    };

## Constructors

    template <typename ExtentList>
    explicit multi_array_ref(element* data,
                         const ExtentList& sizes,
                         const storage_order& store = c_storage_order(),
                         const Allocator& alloc = Allocator());

  This constructs a `multi_array_ref` using the specified parameters. `sizes` specifies the shape of the constructed `multi_array_ref`. `store` specifies the storage order or layout in memory of the array dimensions. `alloc` is used to allocate the contained elements.

  ## `ExtentList` Requirements

  `ExtentList` must model Collection.

  ## Preconditions

  `sizes.size() == NumDims;`

    explicit multi_array_ref(element* data,
                         extent_gen::gen_type<NumDims>::type ranges,
                         const storage_order& store = c_storage_order());

  This constructs a `multi_array_ref` using the specified parameters. `ranges` specifies the shape and index bases of the constructed multi_array_ref. It is the result of `NumDims` chained calls to `extent_gen::operator[]`. `store` specifies the storage order or layout in memory of the array dimensions.

    multi_array_ref(const multi_array_ref& x);

  This constructs a shallow copy of `x`.

  ## Complexity

  Constant time (for contrast, compare this to the `multi_array` class copy constructor.

## Modifiers

    multi_array_ref& operator=(const multi_array_ref& x);
    template <class Array> multi_array_ref& operator=(const Array& x);

  This performs an element-wise copy of `x` into the current `multi_array_ref`.

  ## `Array` Requirements

  `Array` must model MultiArray.

  ## Preconditions

      std::equal(this->shape(),this->shape()+this->num_dimensions(),
      x.shape());

  ## Postconditions

      (*.this) == x;

  ## Complexity

  The assignment operators perform O(`x.num_elements()`) calls to `element`'s copy constructor.