/* * Copyright (C) 2018 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include #include #include template class ArrayRef { public: using iterator = DataType *; using const_iterator = const DataType *; template ArrayRef(IteratorType b, IteratorType e) { if (b != nullptr) { this->b = &*b; this->e = &*(e - 1) + 1; } else { this->b = nullptr; this->e = nullptr; } } template ArrayRef(IteratorType b, size_t s) : ArrayRef(b, b + s) { } template ArrayRef(SequentialContainerType &ctr) : b(&*ctr.begin()), e(&*(ctr.end() - 1) + 1) { } template ArrayRef(DataType (&array)[Size]) : b(&array[0]), e(&array[Size]) { } ArrayRef() = default; size_t size() const { return e - b; } DataType &operator[](std::size_t idx) { return b[idx]; } const DataType &operator[](std::size_t idx) const { return b[idx]; } iterator begin() { return b; } const_iterator begin() const { return b; } iterator end() { return e; } const_iterator end() const { return e; } void swap(ArrayRef &rhs) { std::swap(b, rhs.b); std::swap(e, rhs.e); } operator ArrayRef() { return ArrayRef(b, e); } private: DataType *b = nullptr; DataType *e = nullptr; }; template bool operator==(const ArrayRef &lhs, const ArrayRef &rhs) { if (lhs.size() != rhs.size()) { return false; } auto lhsIt = lhs.begin(); auto lhsEnd = lhs.end(); auto rhsIt = rhs.begin(); for (; lhsIt != lhsEnd; ++lhsIt, ++rhsIt) { if (*lhsIt != *rhsIt) { return false; } } return true; }