diff --git a/pascal.cpp b/pascal.cpp index 2dd171c1..87761817 100644 --- a/pascal.cpp +++ b/pascal.cpp @@ -16,41 +16,46 @@ #include "pascal.hpp" +#include "debug.hpp" + +#include #include using util::parray; /////////////////////////////////////////////////////////////////////////////// -template -parray::parray (size_t _size, T *_data): +template +parray::parray (SizeT _size, DataT *_data): m_size (_size), m_data (_data) { ; } /////////////////////////////////////////////////////////////////////////////// -template -T& -parray::operator[] (size_t idx) +template +DataT& +parray::operator[] (SizeT idx) { + CHECK_LIMIT(idx, 0u, m_size); return data ()[idx]; } //----------------------------------------------------------------------------- -template -const T& -parray::operator[] (size_t idx) const +template +const DataT& +parray::operator[] (SizeT idx) const { + CHECK_LIMIT(idx, 0u, m_size); return data ()[idx]; } /////////////////////////////////////////////////////////////////////////////// -template -T& -parray::at (size_t idx) +template +DataT& +parray::at (SizeT idx) { if (idx >= size ()) throw std::out_of_range ("invalid index for parray"); @@ -60,9 +65,9 @@ parray::at (size_t idx) //----------------------------------------------------------------------------- -template -const T& -parray::at (size_t idx) const +template +const DataT& +parray::at (SizeT idx) const { if (idx >= size ()) throw std::out_of_range ("invalid index for parray"); @@ -72,110 +77,129 @@ parray::at (size_t idx) const /////////////////////////////////////////////////////////////////////////////// -template -T* -parray::begin (void) +template +DataT* +parray::begin (void) { return data (); } //----------------------------------------------------------------------------- -template -T* -parray::end (void) +template +DataT* +parray::end (void) { return data () + size (); } /////////////////////////////////////////////////////////////////////////////// -template -const T* -parray::cbegin (void) const +template +const DataT* +parray::cbegin (void) const { return data (); } //----------------------------------------------------------------------------- -template -const T* -parray::cend (void) const +template +const DataT* +parray::cend (void) const { return data () + size (); } /////////////////////////////////////////////////////////////////////////////// -template -const T* -parray::data (void) const +template +const DataT* +parray::data (void) const { return m_data; } //----------------------------------------------------------------------------- -template -T* -parray::data (void) +template +DataT* +parray::data (void) { return m_data; } //----------------------------------------------------------------------------- -template -size_t -parray::size (void) const +template +SizeT +parray::size (void) const { return m_size; } /////////////////////////////////////////////////////////////////////////////// -template +template std::ostream& -util::operator<< (std::ostream &os, parray p) +util::operator<< (std::ostream &os, parray p) { - auto size = p.size (); - uintptr_t ptr = reinterpret_cast (p.data ()); - os << "[" << size << ", " << std::hex << ptr << std::dec << "]"; + std::copy_n ( + p.cbegin (), + p.size (), + std::ostream_iterator (os) + ); + return os; } //----------------------------------------------------------------------------- -template std::ostream& util::operator<< (std::ostream&, parray); -template std::ostream& util::operator<< (std::ostream&, parray); -template std::ostream& util::operator<< (std::ostream&, parray); +template +std::ostream& +util::operator<< (std::ostream &os, parray p) +{ + std::copy_n ( + p.cbegin (), + p.size (), + std::ostream_iterator (os) + ); -template std::ostream& util::operator<< (std::ostream&, parray); -template std::ostream& util::operator<< (std::ostream&, parray); -template std::ostream& util::operator<< (std::ostream&, parray); + return os; +} /////////////////////////////////////////////////////////////////////////////// -template class util::parray; -template class util::parray; +template +std::ostream& +util::operator<< (std::ostream &os, parray p) +{ + auto size = p.size (); + uintptr_t ptr = reinterpret_cast (p.data ()); + os << "[" << +size << ", " << std::hex << ptr << std::dec << "]"; + return os; +} -template class util::parray; -template class util::parray; -template class util::parray; -template class util::parray; -template class util::parray; -template class util::parray; -template class util::parray; -template class util::parray; -template class util::parray; -template class util::parray; -template class util::parray; -template class util::parray; -template class util::parray; -template class util::parray; -template class util::parray; -template class util::parray; +/////////////////////////////////////////////////////////////////////////////// +#define INSTANTIATE_D_S(D,S) \ +template std::ostream& util::operator<< (std::ostream&, parray< D,S>); \ +template std::ostream& util::operator<< (std::ostream&, parray); \ + \ +template class util::parray< D,S>; \ +template class util::parray; + +//----------------------------------------------------------------------------- +#define INSTANTIATE_D(D) \ +INSTANTIATE_D_S(D, uint16_t) \ +INSTANTIATE_D_S(D, uint32_t) \ +INSTANTIATE_D_S(D, uint64_t) + + +//----------------------------------------------------------------------------- +INSTANTIATE_D (char) +INSTANTIATE_D (uint16_t) +INSTANTIATE_D (uint32_t) +INSTANTIATE_D (uint64_t) diff --git a/pascal.hpp b/pascal.hpp index b9183877..92a0eef3 100644 --- a/pascal.hpp +++ b/pascal.hpp @@ -21,35 +21,43 @@ #include namespace util { - template + template class parray { public: - parray (size_t size, T *data); + parray (SizeT size, DataT *data); - T& operator[] (size_t idx); - const T& operator[] (size_t idx) const; + DataT& operator[] (SizeT idx); + const DataT& operator[] (SizeT idx) const; - T& at (size_t idx); - const T& at (size_t idx) const; + DataT& at (SizeT idx); + const DataT& at (SizeT idx) const; - T* begin (void); - T* end (void); + DataT* begin (void); + DataT* end (void); - const T* cbegin (void) const; - const T* cend (void) const; + const DataT* cbegin (void) const; + const DataT* cend (void) const; - const T* data (void) const; - T* data (void); - size_t size (void) const; + const DataT* data (void) const; + DataT* data (void); + SizeT size (void) const; private: - const size_t m_size; - T *m_data; + const SizeT m_size; + DataT *m_data; }; - template + template std::ostream& - operator<< (std::ostream&, util::parray); + operator<< (std::ostream&, util::parray); + + template + std::ostream& + operator<< (std::ostream&, util::parray); + + template + std::ostream& + operator<< (std::ostream&, util::parray); }