156aa031bSSergey Makeev // The MIT License (MIT) 256aa031bSSergey Makeev // 356aa031bSSergey Makeev // Copyright (c) 2015 Sergey Makeev, Vadim Slyusarev 456aa031bSSergey Makeev // 556aa031bSSergey Makeev // Permission is hereby granted, free of charge, to any person obtaining a copy 656aa031bSSergey Makeev // of this software and associated documentation files (the "Software"), to deal 756aa031bSSergey Makeev // in the Software without restriction, including without limitation the rights 856aa031bSSergey Makeev // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 956aa031bSSergey Makeev // copies of the Software, and to permit persons to whom the Software is 1056aa031bSSergey Makeev // furnished to do so, subject to the following conditions: 1156aa031bSSergey Makeev // 1256aa031bSSergey Makeev // The above copyright notice and this permission notice shall be included in 1356aa031bSSergey Makeev // all copies or substantial portions of the Software. 1456aa031bSSergey Makeev // 1556aa031bSSergey Makeev // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1656aa031bSSergey Makeev // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1756aa031bSSergey Makeev // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1856aa031bSSergey Makeev // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1956aa031bSSergey Makeev // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 2056aa031bSSergey Makeev // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 2156aa031bSSergey Makeev // THE SOFTWARE. 2256aa031bSSergey Makeev 2356aa031bSSergey Makeev #pragma once 2456aa031bSSergey Makeev 2556aa031bSSergey Makeev 2656aa031bSSergey Makeev namespace MT 2756aa031bSSergey Makeev { 2856aa031bSSergey Makeev 2956aa031bSSergey Makeev 3056aa031bSSergey Makeev /// \class ArrayView 3156aa031bSSergey Makeev /// \brief Simple wrapper to work with raw memory as an array. Includes array bounds checking. 3256aa031bSSergey Makeev template<class T> 3356aa031bSSergey Makeev class ArrayView 3456aa031bSSergey Makeev { 3556aa031bSSergey Makeev T* data; 3656aa031bSSergey Makeev size_t count; 3756aa031bSSergey Makeev 3856aa031bSSergey Makeev public: 3956aa031bSSergey Makeev ArrayView()401579620aSSergey Makeev ArrayView() 411579620aSSergey Makeev { 421579620aSSergey Makeev data = nullptr; 431579620aSSergey Makeev count = 0; 441579620aSSergey Makeev } 451579620aSSergey Makeev ArrayView(void * memoryChunk,size_t instanceCount)4656aa031bSSergey Makeev ArrayView(void* memoryChunk, size_t instanceCount) 4756aa031bSSergey Makeev : data((T*)memoryChunk) 4856aa031bSSergey Makeev , count(instanceCount) 4956aa031bSSergey Makeev { 5056aa031bSSergey Makeev MT_ASSERT(count == 0 || data, "Invalid data array"); 5156aa031bSSergey Makeev } 5256aa031bSSergey Makeev ~ArrayView()531579620aSSergey Makeev ~ArrayView() 541579620aSSergey Makeev { 551579620aSSergey Makeev data = nullptr; 561579620aSSergey Makeev count = 0; 571579620aSSergey Makeev } 581579620aSSergey Makeev 5956aa031bSSergey Makeev const T &operator[]( size_t i ) const 6056aa031bSSergey Makeev { 6156aa031bSSergey Makeev MT_ASSERT( i < Size(), "bad index" ); 6256aa031bSSergey Makeev return data[i]; 6356aa031bSSergey Makeev } 6456aa031bSSergey Makeev 6556aa031bSSergey Makeev T &operator[]( size_t i ) 6656aa031bSSergey Makeev { 6756aa031bSSergey Makeev MT_ASSERT( i < Size(), "bad index" ); 6856aa031bSSergey Makeev return data[i]; 6956aa031bSSergey Makeev } 7056aa031bSSergey Makeev Size()7156aa031bSSergey Makeev size_t Size() const 7256aa031bSSergey Makeev { 7356aa031bSSergey Makeev return count; 7456aa031bSSergey Makeev } 7556aa031bSSergey Makeev IsEmpty()7656aa031bSSergey Makeev bool IsEmpty() const 7756aa031bSSergey Makeev { 7856aa031bSSergey Makeev return count == 0; 7956aa031bSSergey Makeev } 801579620aSSergey Makeev GetRawData()81*f4db079dSs.makeev T* GetRawData() 821579620aSSergey Makeev { 831579620aSSergey Makeev return data; 841579620aSSergey Makeev } 85*f4db079dSs.makeev GetRawData()86*f4db079dSs.makeev const T* GetRawData() const 87*f4db079dSs.makeev { 88*f4db079dSs.makeev return data; 89*f4db079dSs.makeev } 90*f4db079dSs.makeev 9156aa031bSSergey Makeev }; 9256aa031bSSergey Makeev 9356aa031bSSergey Makeev 9456aa031bSSergey Makeev } 95