Chris@16: // Copyright 2002 The Trustees of Indiana University. Chris@16: Chris@16: // Use, modification and distribution is subject to the Boost Software Chris@16: // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // Boost.MultiArray Library Chris@16: // Authors: Ronald Garcia Chris@16: // Jeremy Siek Chris@16: // Andrew Lumsdaine Chris@16: // See http://www.boost.org/libs/multi_array for documentation. Chris@16: Chris@16: #ifndef BOOST_STORAGE_ORDER_RG071801_HPP Chris@16: #define BOOST_STORAGE_ORDER_RG071801_HPP Chris@16: Chris@16: #include "boost/multi_array/types.hpp" Chris@16: #include "boost/array.hpp" Chris@16: #include "boost/multi_array/algorithm.hpp" Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: // RG - This is to make things work with VC++. So sad, so sad. Chris@16: class c_storage_order; Chris@16: class fortran_storage_order; Chris@16: Chris@16: template Chris@16: class general_storage_order Chris@16: { Chris@16: public: Chris@16: typedef detail::multi_array::size_type size_type; Chris@16: template Chris@16: general_storage_order(OrderingIter ordering, Chris@16: AscendingIter ascending) { Chris@16: boost::detail::multi_array::copy_n(ordering,NumDims,ordering_.begin()); Chris@16: boost::detail::multi_array::copy_n(ascending,NumDims,ascending_.begin()); Chris@16: } Chris@16: Chris@16: // RG - ideally these would not be necessary, but some compilers Chris@16: // don't like template conversion operators. I suspect that not Chris@16: // too many folk will feel the need to use customized Chris@16: // storage_order objects, I sacrifice that feature for compiler support. Chris@16: general_storage_order(const c_storage_order&) { Chris@16: for (size_type i=0; i != NumDims; ++i) { Chris@16: ordering_[i] = NumDims - 1 - i; Chris@16: } Chris@16: ascending_.assign(true); Chris@16: } Chris@16: Chris@16: general_storage_order(const fortran_storage_order&) { Chris@16: for (size_type i=0; i != NumDims; ++i) { Chris@16: ordering_[i] = i; Chris@16: } Chris@16: ascending_.assign(true); Chris@16: } Chris@16: Chris@16: size_type ordering(size_type dim) const { return ordering_[dim]; } Chris@16: bool ascending(size_type dim) const { return ascending_[dim]; } Chris@16: Chris@16: bool all_dims_ascending() const { Chris@16: return std::accumulate(ascending_.begin(),ascending_.end(),true, Chris@16: std::logical_and()); Chris@16: } Chris@16: Chris@16: bool operator==(general_storage_order const& rhs) const { Chris@16: return (ordering_ == rhs.ordering_) && Chris@16: (ascending_ == rhs.ascending_); Chris@16: } Chris@16: Chris@16: protected: Chris@16: boost::array ordering_; Chris@16: boost::array ascending_; Chris@16: }; Chris@16: Chris@16: class c_storage_order Chris@16: { Chris@16: typedef detail::multi_array::size_type size_type; Chris@16: public: Chris@16: // This is the idiom for creating your own custom storage orders. Chris@16: // Not supported by all compilers though! Chris@16: #ifndef __MWERKS__ // Metrowerks screams "ambiguity!" Chris@16: template Chris@16: operator general_storage_order() const { Chris@16: boost::array ordering; Chris@16: boost::array ascending; Chris@16: Chris@16: for (size_type i=0; i != NumDims; ++i) { Chris@16: ordering[i] = NumDims - 1 - i; Chris@16: ascending[i] = true; Chris@16: } Chris@16: return general_storage_order(ordering.begin(), Chris@16: ascending.begin()); Chris@16: } Chris@16: #endif Chris@16: }; Chris@16: Chris@16: class fortran_storage_order Chris@16: { Chris@16: typedef detail::multi_array::size_type size_type; Chris@16: public: Chris@16: // This is the idiom for creating your own custom storage orders. Chris@16: // Not supported by all compilers though! Chris@16: #ifndef __MWERKS__ // Metrowerks screams "ambiguity!" Chris@16: template Chris@16: operator general_storage_order() const { Chris@16: boost::array ordering; Chris@16: boost::array ascending; Chris@16: Chris@16: for (size_type i=0; i != NumDims; ++i) { Chris@16: ordering[i] = i; Chris@16: ascending[i] = true; Chris@16: } Chris@16: return general_storage_order(ordering.begin(), Chris@16: ascending.begin()); Chris@16: } Chris@16: #endif Chris@16: }; Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_ARRAY_STORAGE_RG071801_HPP