43 #ifndef DOMI_MDARRAYRCP_HPP
44 #define DOMI_MDARRAYRCP_HPP
50 #include "Teuchos_ArrayRCPDecl.hpp"
53 #include "Domi_ConfigDefs.hpp"
54 #include "Domi_Utils.hpp"
55 #include "Domi_MDArrayView.hpp"
69 template<
typename T >
78 template<
typename T >
87 template<
typename T >
96 template<
typename T >
105 template<
typename T >
113 template<
typename T >
122 template<
typename T >
131 template<
typename T >
140 template<
typename T >
153 template<
typename T >
186 MDArrayRCP(Teuchos::ENull null_arg = Teuchos::null);
205 MDArrayRCP(
const Teuchos::ArrayView< T > & array,
206 const Teuchos::ArrayView< dim_type > & dims,
207 Layout
layout = DEFAULT_ORDER);
225 MDArrayRCP(
const Teuchos::ArrayView< dim_type > & dims,
227 Layout
layout = DEFAULT_ORDER);
242 MDArrayRCP(
const Teuchos::ArrayView< dim_type > & dims,
266 MDArrayRCP(
const Teuchos::ArrayView< dim_type > & dims,
267 const Teuchos::ArrayView< size_type > &
strides,
269 Layout
layout = DEFAULT_ORDER);
305 inline const Teuchos::Array< dim_type > &
dimensions()
const;
312 inline dim_type
dimension(
int axis)
const;
316 inline size_type
size()
const;
320 inline const Teuchos::Array< size_type > &
strides()
const;
324 inline const Teuchos::ArrayRCP< T > &
arrayRCP()
const;
328 inline const Layout
layout()
const;
525 inline T &
operator()(dim_type i, dim_type j);
539 inline T &
operator()(dim_type i, dim_type j, dim_type k);
555 inline T &
operator()(dim_type i, dim_type j, dim_type k, dim_type m);
573 inline T &
operator()(dim_type i, dim_type j, dim_type k, dim_type m,
597 inline T &
operator()(dim_type i, dim_type j, dim_type k, dim_type m,
598 dim_type n, dim_type p, ...);
608 inline const T &
operator()(dim_type i)
const;
620 inline const T &
operator()(dim_type i, dim_type j)
const;
634 inline const T &
operator()(dim_type i, dim_type j, dim_type k)
const;
650 inline const T &
operator()(dim_type i, dim_type j, dim_type k,
669 inline const T &
operator()(dim_type i, dim_type j, dim_type k,
670 dim_type m, dim_type n)
const;
693 inline const T &
operator()(dim_type i, dim_type j, dim_type k,
694 dim_type m, dim_type n, dim_type p, ...)
const;
739 inline bool empty()
const;
754 void resize(
const Teuchos::ArrayView< dim_type > & dims);
786 template<
typename T2 >
792 template<
typename T2 >
798 template<
typename T2 >
804 template<
typename T2 >
810 template<
typename T2 >
816 template<
typename T2 >
822 template<
typename T2 >
828 template<
typename T2 >
834 template<
typename T2 >
840 template<
typename T2 >
846 template<
typename T2 >
847 friend std::ostream &
operator<<(std::ostream & os,
853 Teuchos::Array< dim_type > _dimensions;
854 Teuchos::Array< size_type > _strides;
855 Teuchos::ArrayRCP< T > _array;
860 void assertAxis(
int axis)
const;
863 void assertIndex(dim_type i,
int axis)
const;
872 template<
typename T >
874 _dimensions(Teuchos::tuple< dim_type >(0)),
875 _strides(Teuchos::tuple< size_type >(1)),
877 _layout(DEFAULT_ORDER),
884 template<
typename T >
886 const Teuchos::ArrayView< dim_type > & dims,
889 _strides(computeStrides< size_type, dim_type >(dims, layout)),
890 _array(array.getRawPtr(), 0, array.size(), false),
892 _ptr(_array.getRawPtr())
894 TEUCHOS_TEST_FOR_EXCEPTION(array.size() < computeSize(dims),
896 "Teuchos::ArrayView size too small for "
902 template<
typename T >
907 _strides(computeStrides< size_type, dim_type >(dims, layout)),
908 _array(computeSize(dims), val),
910 _ptr(_array.getRawPtr())
916 template<
typename T >
920 _strides(computeStrides< size_type, dim_type >(dims, layout)),
921 _array(computeSize(dims)),
923 _ptr(_array.getRawPtr())
929 template<
typename T >
931 const Teuchos::ArrayView< size_type > & strides,
936 _array(data, 0, computeSize(dims, strides), false),
944 template<
typename T >
946 _dimensions(r_ptr._dimensions),
947 _strides(r_ptr._strides),
948 _array(r_ptr._array),
949 _layout(r_ptr._layout),
950 _ptr(_array.getRawPtr())
956 template<
typename T >
958 _dimensions(source.dimensions()),
959 _strides(computeStrides< size_type, dim_type >(source.dimensions(),
961 _array(computeSize(source.dimensions())),
962 _layout(source.layout()),
963 _ptr(_array.getRawPtr())
968 for ( ; srcit != source.
cend(); ++thisit, ++srcit)
976 template<
typename T >
983 template<
typename T >
987 _dimensions = r_ptr._dimensions;
988 _strides = r_ptr._strides;
989 _array = r_ptr._array;
990 _layout = r_ptr._layout;
997 template<
typename T >
1001 return _dimensions.size();
1006 template<
typename T >
1007 const Teuchos::Array< dim_type > &
1015 template<
typename T >
1019 #ifdef HAVE_DOMI_ARRAY_BOUNDSCHECK
1022 return _dimensions[axis];
1027 template<
typename T >
1031 return _array.size();
1036 template<
typename T >
1037 const Teuchos::Array< size_type > &
1045 template<
typename T >
1046 const Teuchos::ArrayRCP< T > &
1054 template<
typename T >
1063 template<
typename T >
1072 template<
typename T >
1082 template<
typename T >
1091 template<
typename T >
1101 template<
typename T >
1110 template<
typename T >
1120 template<
typename T >
1129 template<
typename T >
1139 template<
typename T >
1148 template<
typename T >
1158 template<
typename T >
1162 return _array.is_null();
1167 template<
typename T >
1171 return _array.operator->();
1176 template<
typename T >
1180 return _array.operator*();
1185 template<
typename T >
1189 return _array.get();
1194 template<
typename T >
1203 template<
typename T >
1207 Teuchos::Array< dim_type > dims(_dimensions);
1213 template<
typename T >
1222 template<
typename T >
1231 template<
typename T >
1234 return mdArrayView();
1239 template<
typename T >
1242 return mdArrayViewConst();
1247 template<
typename T >
1253 return mdArrayView()[i];
1258 template<
typename T >
1264 return mdArrayView()[i];
1269 template<
typename T >
1274 return mdArrayView()[s];
1279 template<
typename T >
1284 return mdArrayView()[s];
1289 template<
typename T >
1293 return mdArrayView();
1298 template<
typename T >
1302 return mdArrayView();
1307 template<
typename T >
1311 #ifdef HAVE_DOMI_ARRAY_BOUNDSCHECK
1312 TEUCHOS_TEST_FOR_EXCEPTION(
1314 "Attempt to access " << _dimensions.size() <<
"D array with 1 index"
1318 return _ptr[i * _strides[0]];
1323 template<
typename T >
1328 #ifdef HAVE_DOMI_ARRAY_BOUNDSCHECK
1329 TEUCHOS_TEST_FOR_EXCEPTION(
1331 "Attempt to access " << _dimensions.size() <<
"D array with 2 indexes"
1336 return _ptr[i * _strides[0] + j * _strides[1]];
1341 template<
typename T >
1347 #ifdef HAVE_DOMI_ARRAY_BOUNDSCHECK
1348 TEUCHOS_TEST_FOR_EXCEPTION(
1350 "Attempt to access " << _dimensions.size() <<
"D array with 3 indexes"
1356 return _ptr[i * _strides[0] + j * _strides[1] + k * _strides[2]];
1361 template<
typename T >
1368 #ifdef HAVE_DOMI_ARRAY_BOUNDSCHECK
1369 TEUCHOS_TEST_FOR_EXCEPTION(
1371 "Attempt to access " << _dimensions.size() <<
"D array with 4 indexes"
1378 return _ptr[i * _strides[0] + j * _strides[1] + k * _strides[2] +
1384 template<
typename T >
1392 #ifdef HAVE_DOMI_ARRAY_BOUNDSCHECK
1393 TEUCHOS_TEST_FOR_EXCEPTION(
1395 "Attempt to access " << _dimensions.size() <<
"D array with 5 indexes"
1403 return _ptr[i * _strides[0] + j * _strides[1] + k * _strides[2] +
1404 m * _strides[3] + n * _strides[4]];
1409 template<
typename T >
1419 #ifdef HAVE_DOMI_ARRAY_BOUNDSCHECK
1420 TEUCHOS_TEST_FOR_EXCEPTION(
1422 "Attempt to access " << _dimensions.size() <<
"D array with too many indexes"
1432 size_type offset = i * _strides[0] + j * _strides[1] + k * _strides[2] +
1433 m * _strides[3] + n * _strides[4] + p * _strides[5];
1434 va_start(indexes, p);
1435 for (
int axis = 6; axis < _dimensions.size(); axis++)
1437 dim_type q = va_arg(indexes, dim_type);
1438 #ifdef HAVE_DOMI_ARRAY_BOUNDSCHECK
1439 assertIndex(q, axis);
1441 offset += q * _strides[axis];
1444 return _ptr[offset];
1449 template<
typename T >
1453 #ifdef HAVE_DOMI_ARRAY_BOUNDSCHECK
1454 TEUCHOS_TEST_FOR_EXCEPTION(
1456 "Attempt to access " << _dimensions.size() <<
"D array with 1 index"
1460 return _ptr[i * _strides[0]];
1465 template<
typename T >
1470 #ifdef HAVE_DOMI_ARRAY_BOUNDSCHECK
1471 TEUCHOS_TEST_FOR_EXCEPTION(
1473 "Attempt to access " << _dimensions.size() <<
"D array with 2 indexes"
1478 return _ptr[i * _strides[0] + j * _strides[1]];
1483 template<
typename T >
1489 #ifdef HAVE_DOMI_ARRAY_BOUNDSCHECK
1490 TEUCHOS_TEST_FOR_EXCEPTION(
1492 "Attempt to access " << _dimensions.size() <<
"D array with 3 indexes"
1498 return _ptr[i * _strides[0] + j * _strides[1] + k * _strides[2]];
1503 template<
typename T >
1510 #ifdef HAVE_DOMI_ARRAY_BOUNDSCHECK
1511 TEUCHOS_TEST_FOR_EXCEPTION(
1513 "Attempt to access " << _dimensions.size() <<
"D array with 4 indexes"
1520 return _ptr[i * _strides[0] + j * _strides[1] + k * _strides[2] +
1526 template<
typename T >
1534 #ifdef HAVE_DOMI_ARRAY_BOUNDSCHECK
1535 TEUCHOS_TEST_FOR_EXCEPTION(
1537 "Attempt to access " << _dimensions.size() <<
"D array with 5 indexes"
1545 return _ptr[i * _strides[0] + j * _strides[1] + k * _strides[2] +
1546 m * _strides[3] + n * _strides[4]];
1551 template<
typename T >
1561 #ifdef HAVE_DOMI_ARRAY_BOUNDSCHECK
1562 TEUCHOS_TEST_FOR_EXCEPTION(
1564 "Attempt to access " << _dimensions.size() <<
"D array with too many indexes"
1574 size_type offset = i * _strides[0] + j * _strides[1] + k * _strides[2] +
1575 m * _strides[3] + n * _strides[4] + p * _strides[5];
1576 va_start(indexes, p);
1577 for (
int axis = 6; axis < _dimensions.size(); axis++)
1579 dim_type q = va_arg(indexes, dim_type);
1580 #ifdef HAVE_DOMI_ARRAY_BOUNDSCHECK
1581 assertIndex(q, axis);
1583 offset += q * _strides[axis];
1586 return _ptr[offset];
1591 template<
typename T >
1595 for (
iterator it = begin(); it != end(); ++it)
1601 template<
typename T >
1607 size_type offset = i * _strides[0];
1608 va_start(indexes, i);
1609 for (
int axis = 1; axis < _dimensions.size(); axis++)
1611 dim_type j = va_arg(indexes, dim_type);
1612 assertIndex(j, axis);
1613 offset += j * _strides[axis];
1616 return _array[offset];
1621 template<
typename T >
1627 size_type offset = i * _strides[0];
1628 va_start(indexes, i);
1629 for (
int axis = 1; axis < _dimensions.size(); axis++)
1631 dim_type j = va_arg(indexes, dim_type);
1632 assertIndex(j, axis);
1633 offset += j * _strides[axis];
1636 return _array[offset];
1641 template<
typename T >
1645 return _array.capacity();
1650 template<
typename T >
1654 _dimensions.resize(1);
1659 _ptr = _array.getRawPtr();
1664 template<
typename T >
1668 return (_array.size() == 0);
1673 template<
typename T >
1677 return _array.max_size();
1682 template<
typename T >
1686 _dimensions.assign(dims.begin(), dims.end());
1687 _strides = computeStrides< size_type, dim_type >(dims, _layout);
1688 _array.resize(computeSize(dims));
1689 _ptr = _array.getRawPtr();
1694 template<
typename T >
1698 #ifdef HAVE_DOMI_ARRAY_BOUNDSCHECK
1707 template<
typename T >
1711 return mdArrayView().toString();
1716 template<
typename T >
1720 return _array.getRawPtr();
1725 template<
typename T >
1729 return _array.getRawPtr();
1734 template<
typename T >
1738 return (a1() == a2());
1743 template<
typename T >
1747 return (a1() == a2());
1752 template<
typename T >
1756 return (a1() == a2());
1761 template<
typename T >
1765 return (a1 == a2());
1770 template<
typename T >
1774 return (a1() == a2);
1779 template<
typename T >
1783 return not (a1 == a2);
1788 template<
typename T >
1791 return (a1() != a2());
1796 template<
typename T >
1799 return (a1() != a2());
1804 template<
typename T >
1808 return (a1 != a2());
1813 template<
typename T >
1817 return (a1() != a2);
1822 template<
typename T >
1823 std::ostream & operator<<(std::ostream & os,
1834 template<
typename T >
1836 MDArrayRCP< T >::assertAxis(
int axis)
const
1838 TEUCHOS_TEST_FOR_EXCEPTION(
1839 !(0 <= axis && axis < _dimensions.size()),
1841 "MDArrayRCP<T>::assertAxis(axis=" << axis <<
"): out of "
1842 <<
"range axis in [0, " << _dimensions.size() <<
")"
1848 template<
typename T >
1850 MDArrayRCP< T >::assertIndex(dim_type i,
int axis)
const
1852 TEUCHOS_TEST_FOR_EXCEPTION(
1853 !(0 <= i && i < _dimensions[axis]), RangeError,
1854 "MDArrayRCP<T>::assertIndex(i=" << i <<
",axis=" << axis <<
"): out of "
1855 <<
"range i in [0, " << _dimensions[axis] <<
")"
1861 #endif // DOMI_MDARRAYRCP_HPP
const_pointer getRawPtr() const
Return a const raw pointer to the beginning of the MDArrayRCP or NULL if unsized. ...
Definition: Domi_MDArrayRCP.hpp:1718
int numDims() const
Return the number of dimensions.
Definition: Domi_MDArrayRCP.hpp:999
reference at(dim_type i,...)
Non-const single element access method with bounds checking.
Definition: Domi_MDArrayRCP.hpp:1603
bool is_null() const
Return true if the underlying pointer is null.
Definition: Domi_MDArrayRCP.hpp:1160
void resize(const Teuchos::ArrayView< dim_type > &dims)
Resize the MDArrayRCP based on the given dimensions.
Definition: Domi_MDArrayRCP.hpp:1684
friend std::ostream & operator<<(std::ostream &os, const MDArrayRCP< T2 > &a)
Stream output operator.
T value_type
Value type.
Definition: Domi_MDArrayRCP.hpp:162
const T & const_reference
Const reference type.
Definition: Domi_MDArrayRCP.hpp:174
std::string toString() const
Convert the MDArrayRCP to a string representation.
Definition: Domi_MDArrayRCP.hpp:1709
dim_type dimension(int axis) const
Return the dimension of the given axis.
Definition: Domi_MDArrayRCP.hpp:1017
reference operator*()
Dereference the underlying data buffer.
Definition: Domi_MDArrayRCP.hpp:1178
Iterator class suitable for multi-dimensional arrays.
Definition: Domi_MDIterator.hpp:100
Range Error exception type.
Definition: Domi_Exceptions.hpp:65
MDArrayView< const T > mdArrayViewConst()
Perform an explicit conversion to a non-const MDArrayView<const T>
Definition: Domi_MDArrayRCP.hpp:1215
pointer operator->() const
Pointer -> access to members of underlying data buffer.
Definition: Domi_MDArrayRCP.hpp:1169
friend bool operator==(const MDArrayRCP< T2 > &a1, const MDArrayRCP< T2 > &a2)
Equality operator.
static bool hasBoundsChecking()
Return true if MDArrayRCP has been compiled with bounds checking on.
Definition: Domi_MDArrayRCP.hpp:1696
reverse_iterator rend()
Return the ending reverse_iterator.
Definition: Domi_MDArrayRCP.hpp:1131
const_iterator cend() const
Return the ending const_iterator.
Definition: Domi_MDArrayView.hpp:1007
T * pointer
Pointer type.
Definition: Domi_MDArrayRCP.hpp:165
pointer get() const
Get the raw C++ pointer to the underlying data buffer.
Definition: Domi_MDArrayRCP.hpp:1187
MDArrayRCP< T > & operator=(const MDArrayRCP< T > &r_ptr)
Assignment operator.
Definition: Domi_MDArrayRCP.hpp:985
size_type max_size() const
Return the maximum allowable size for the MDArrayRCP
Definition: Domi_MDArrayRCP.hpp:1675
const Layout layout() const
Return the storage order.
Definition: Domi_MDArrayRCP.hpp:1056
iterator begin()
Return the beginning iterator.
Definition: Domi_MDArrayRCP.hpp:1065
A Slice contains a start, stop, and step index, describing a subset of an ordered container...
Definition: Domi_Slice.hpp:137
void clear()
Clear the MDArrayRCP
Definition: Domi_MDArrayRCP.hpp:1652
const Teuchos::ArrayRCP< T > & arrayRCP() const
Return the underlying Teuchos::ArrayRCP
Definition: Domi_MDArrayRCP.hpp:1047
const_iterator cbegin() const
Return the beginning const_iterator.
Definition: Domi_MDArrayView.hpp:998
T & reference
Reference type.
Definition: Domi_MDArrayRCP.hpp:171
MDArrayView< T > operator[](dim_type i)
Sub-array access operator. The returned MDArrayView object will have one fewer dimensions than the ca...
Definition: Domi_MDArrayRCP.hpp:1249
~MDArrayRCP()
Destructor.
Definition: Domi_MDArrayRCP.hpp:977
size_type size() const
Return the total size of the MDArrayRCP
Definition: Domi_MDArrayRCP.hpp:1029
const_reverse_iterator crbegin() const
Return the beginning const_reverse_iterator.
Definition: Domi_MDArrayRCP.hpp:1141
MDArrayView< T > mdArrayView()
Perform an explicit conversion to a non-const MDArrayView<T>
Definition: Domi_MDArrayRCP.hpp:1196
Memory-safe templated multi-dimensional array view class.
Definition: Domi_MDArrayView.hpp:70
iterator end()
Return the ending iterator.
Definition: Domi_MDArrayRCP.hpp:1074
const_iterator cbegin() const
Return the beginning const_iterator.
Definition: Domi_MDArrayRCP.hpp:1103
MDArrayRCP(Teuchos::ENull null_arg=Teuchos::null)
Default constructor.
Definition: Domi_MDArrayRCP.hpp:873
const T * const_pointer
Const pointer type.
Definition: Domi_MDArrayRCP.hpp:168
size_type capacity() const
Return the capacity of the underlying Teuchos::ArrayRCP
Definition: Domi_MDArrayRCP.hpp:1643
bool empty() const
Return whether the MDArrayRCP is empty.
Definition: Domi_MDArrayRCP.hpp:1666
MDArrayView< T > operator()()
Conversion to MDArrayView
Definition: Domi_MDArrayRCP.hpp:1291
const Teuchos::Array< dim_type > & dimensions() const
Return the array of dimensions.
Definition: Domi_MDArrayRCP.hpp:1008
reverse_iterator rbegin()
Return the beginning reverse_iterator.
Definition: Domi_MDArrayRCP.hpp:1122
Reverse iterator class suitable for multi-dimensional arrays.
Definition: Domi_MDRevIterator.hpp:98
Memory-safe templated multi-dimensional array class.
Definition: Domi_MDArray.hpp:65
const_reverse_iterator crend() const
Return the ending const_reverse_iterator.
Definition: Domi_MDArrayRCP.hpp:1150
const_iterator cend() const
Return the ending const_iterator.
Definition: Domi_MDArrayRCP.hpp:1112
Memory-safe, reference-counted, templated, multi-dimensional array class.
Definition: Domi_MDArrayRCP.hpp:63
friend bool operator!=(const MDArrayRCP< T2 > &a1, const MDArrayRCP< T2 > &a2)
Inequality operator.
const Teuchos::Array< size_type > & strides() const
Return the indexing strides.
Definition: Domi_MDArrayRCP.hpp:1038
void assign(const_reference value)
Assign a value to all elements of the MDArrayRCP
Definition: Domi_MDArrayRCP.hpp:1593