Ivan Mahonin 0ed2f6
#pragma once
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
#ifndef TCONSTWRAPPER_INCLUDED
Ivan Mahonin 0ed2f6
#define TCONSTWRAPPER_INCLUDED
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
#include <cstddef>
Ivan Mahonin 0ed2f6
#include <cassert>
Ivan Mahonin 0ed2f6
#include <vector>
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
#include "tcommon.h"
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
#undef DVAPI
Ivan Mahonin 0ed2f6
#undef DVVAR
Ivan Mahonin 0ed2f6
#ifdef TNZCORE_EXPORTS
Ivan Mahonin 0ed2f6
#define DVAPI DV_EXPORT_API
Ivan Mahonin 0ed2f6
#define DVVAR DV_EXPORT_VAR
Ivan Mahonin 0ed2f6
#else
Ivan Mahonin 0ed2f6
#define DVAPI DV_IMPORT_API
Ivan Mahonin 0ed2f6
#define DVVAR DV_IMPORT_VAR
Ivan Mahonin 0ed2f6
#endif
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
//=========================================================
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
template<typename T, typename TT>
Ivan Mahonin 0ed2f6
class TConstArrayWrapperT {
Ivan Mahonin 0ed2f6
public:
Ivan Mahonin 0ed2f6
  typedef T value_type;
Ivan Mahonin 0ed2f6
  typedef TT src_value_type;
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
  class reverse_iterator;
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
  class iterator {
Ivan Mahonin 0ed2f6
  private:
Ivan Mahonin 0ed2f6
    const src_value_type *pointer;
Ivan Mahonin 0ed2f6
    friend class TConstArrayWrapperT<value_type, src_value_type>;
Ivan Mahonin 0ed2f6
    friend class reverse_iterator;
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
    explicit iterator(const src_value_type *pointer): pointer(pointer) { }
Ivan Mahonin 0ed2f6
  public:
Ivan Mahonin 0ed2f6
    iterator(): pointer() { }
Ivan Mahonin 0ed2f6
    iterator(const iterator &other): pointer(other.pointer) { }
Ivan Mahonin 0ed2f6
    explicit iterator(const reverse_iterator &other): pointer(other.pointer) { }
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
    iterator& operator=(const iterator &other) const { pointer = other.pointer; return *this; }
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
    bool operator==(const iterator &other) const { return pointer == other.pointer; }
Ivan Mahonin 0ed2f6
    bool operator!=(const iterator &other) const { return pointer != other.pointer; }
Ivan Mahonin 0ed2f6
    bool operator< (const iterator &other) const { return pointer <  other.pointer; }
Ivan Mahonin 0ed2f6
    bool operator> (const iterator &other) const { return pointer >  other.pointer; }
Ivan Mahonin 0ed2f6
    bool operator<=(const iterator &other) const { return pointer <= other.pointer; }
Ivan Mahonin 0ed2f6
    bool operator>=(const iterator &other) const { return pointer >= other.pointer; }
Ivan Mahonin 0ed2f6
    ptrdiff_t operator-(const iterator &other) const { return pointer - other.pointer; }
Ivan Mahonin 0ed2f6
    iterator operator+(ptrdiff_t diff) const { return iterator(pointer + diff); }
Ivan Mahonin 0ed2f6
    iterator operator-(ptrdiff_t diff) const { return iterator(pointer - diff); }
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
    iterator& operator++()   { ++pointer; return *this; }
Ivan Mahonin 0ed2f6
    iterator& operator--()   { --pointer; return *this; }
Ivan Mahonin 0ed2f6
    iterator operator++(int) { ++pointer; return iterator(pointer-1); }
Ivan Mahonin 0ed2f6
    iterator operator--(int) { --pointer; return iterator(pointer+1); }
Ivan Mahonin 0ed2f6
    iterator operator+=(ptrdiff_t diff) { pointer += diff; return *this; }
Ivan Mahonin 0ed2f6
    iterator operator-=(ptrdiff_t diff) { pointer -= diff; return *this; }
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
    const value_type* operator->() const { assert(pointer); return cast(pointer); }
Ivan Mahonin 0ed2f6
    const value_type& operator*()  const { assert(pointer); return *cast(pointer); }
Ivan Mahonin 0ed2f6
  };
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
  class reverse_iterator {
Ivan Mahonin 0ed2f6
  private:
Ivan Mahonin 0ed2f6
    const src_value_type *pointer;
Ivan Mahonin 0ed2f6
    friend class TConstArrayWrapperT<value_type, src_value_type>;
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
    explicit reverse_iterator(const src_value_type *pointer): pointer(pointer) { }
Ivan Mahonin 0ed2f6
  public:
Ivan Mahonin 0ed2f6
    reverse_iterator(): pointer() { }
Ivan Mahonin 0ed2f6
    reverse_iterator(const reverse_iterator &other): pointer(other.pointer) { }
Ivan Mahonin 0ed2f6
    explicit reverse_iterator(const iterator &other): pointer(other.pointer) { }
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
    reverse_iterator& operator=(const reverse_iterator &other) const { pointer = other.pointer; return *this; }
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
    bool operator==(const reverse_iterator &other) const { return pointer == other.pointer; }
Ivan Mahonin 0ed2f6
    bool operator!=(const reverse_iterator &other) const { return pointer != other.pointer; }
Ivan Mahonin 0ed2f6
    bool operator< (const reverse_iterator &other) const { return pointer >  other.pointer; }
Ivan Mahonin 0ed2f6
    bool operator> (const reverse_iterator &other) const { return pointer <  other.pointer; }
Ivan Mahonin 0ed2f6
    bool operator<=(const reverse_iterator &other) const { return pointer >= other.pointer; }
Ivan Mahonin 0ed2f6
    bool operator>=(const reverse_iterator &other) const { return pointer <= other.pointer; }
Ivan Mahonin 0ed2f6
    ptrdiff_t operator-(const reverse_iterator &other) const { return other.pointer - pointer; }
Ivan Mahonin 0ed2f6
    reverse_iterator operator+(ptrdiff_t diff) const { return reverse_iterator(pointer - diff); }
Ivan Mahonin 0ed2f6
    reverse_iterator operator-(ptrdiff_t diff) const { return reverse_iterator(pointer + diff); }
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
    reverse_iterator& operator++()   { --pointer; return *this; }
Ivan Mahonin 0ed2f6
    reverse_iterator& operator--()   { ++pointer; return *this; }
Ivan Mahonin 0ed2f6
    reverse_iterator operator++(int) { --pointer; return reverse_iterator(pointer+1); }
Ivan Mahonin 0ed2f6
    reverse_iterator operator--(int) { ++pointer; return reverse_iterator(pointer-1); }
Ivan Mahonin 0ed2f6
    reverse_iterator operator+=(ptrdiff_t diff) { pointer -= diff; return *this; }
Ivan Mahonin 0ed2f6
    reverse_iterator operator-=(ptrdiff_t diff) { pointer += diff; return *this; }
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
    const value_type* operator->() const { assert(pointer); return cast(pointer); }
Ivan Mahonin 0ed2f6
    const value_type& operator*()  const { assert(pointer); return *cast(pointer); }
Ivan Mahonin 0ed2f6
  };
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
private:
Ivan Mahonin 0ed2f6
  const src_value_type *m_begin;
Ivan Mahonin 0ed2f6
  const src_value_type *m_end;
Ivan Mahonin 0ed2f6
  const src_value_type *m_rbegin;
Ivan Mahonin 0ed2f6
  const src_value_type *m_rend;
Ivan Mahonin 0ed2f6
  size_t m_size;
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
  static const value_type* cast(const src_value_type *pointer)
Ivan Mahonin 0ed2f6
    { return static_cast<const value_type*>(pointer); }
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
public:
Ivan Mahonin 0ed2f6
  TConstArrayWrapperT():
Ivan Mahonin 0ed2f6
    m_begin(), m_end(), m_rbegin(), m_rend(), m_size() { }
Ivan Mahonin 0ed2f6
  TConstArrayWrapperT(const src_value_type *data, size_t size):
Ivan Mahonin 0ed2f6
    m_begin(), m_end(), m_rbegin(), m_rend(), m_size() { set(data, size); }
Ivan Mahonin 0ed2f6
  TConstArrayWrapperT(const TConstArrayWrapperT &other):
Ivan Mahonin 0ed2f6
    m_begin(), m_end(), m_rbegin(), m_rend(), m_size() { *this = other; }
Ivan Mahonin 0ed2f6
  explicit TConstArrayWrapperT(const std::vector<TT> &v):
Ivan Mahonin 0ed2f6
    m_begin(), m_end(), m_rbegin(), m_rend(), m_size() { set(v); }
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
  void reset() {
Ivan Mahonin 0ed2f6
    m_begin  = 0;
Ivan Mahonin 0ed2f6
    m_end    = 0;
Ivan Mahonin 0ed2f6
    m_rbegin = 0;
Ivan Mahonin 0ed2f6
    m_rend   = 0;
Ivan Mahonin 0ed2f6
    m_size   = 0;
Ivan Mahonin 0ed2f6
  }
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
  void set(const src_value_type *data, size_t size) {
Ivan Mahonin 0ed2f6
    assert((data != 0) == (size != 0));
Ivan Mahonin 0ed2f6
    if (!data) reset();
Ivan Mahonin 0ed2f6
    m_begin  = data;
Ivan Mahonin 0ed2f6
    m_end    = data + size;
Ivan Mahonin 0ed2f6
    m_rbegin = m_end - 1;
Ivan Mahonin 0ed2f6
    m_rend   = m_begin - 1;
Ivan Mahonin 0ed2f6
    m_size   = size;
Ivan Mahonin 0ed2f6
  }
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
  void set(const std::vector<TT> &v)
Ivan Mahonin 0ed2f6
    { if (v.empty()) reset(); else set(&v.front(), v.size()); }
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
  TConstArrayWrapperT& operator=(const TConstArrayWrapperT &other)
Ivan Mahonin 0ed2f6
    { set(other.m_begin, other.m_size); return *this; }
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
  size_t size() const { return m_size; }
Ivan Mahonin 0ed2f6
  bool empty() const { return m_size != 0; }
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
  iterator begin() const
Ivan Mahonin 0ed2f6
    { return iterator(m_begin); }
Ivan Mahonin 0ed2f6
  iterator end() const
Ivan Mahonin 0ed2f6
    { return iterator(m_end); }
Ivan Mahonin 0ed2f6
  reverse_iterator rbegin() const
Ivan Mahonin 0ed2f6
    { return reverse_iterator(m_rbegin); }
Ivan Mahonin 0ed2f6
  reverse_iterator rend() const
Ivan Mahonin 0ed2f6
    { return reverse_iterator(m_rend); }
Ivan Mahonin 0ed2f6
  const value_type& at (size_t index) const
Ivan Mahonin 0ed2f6
    { assert(index < m_size); return *cast(m_begin + index); }
Ivan Mahonin 0ed2f6
  const value_type& operator[] (size_t index) const
Ivan Mahonin 0ed2f6
    { return at(index); }
Ivan Mahonin 0ed2f6
  const value_type& front() const
Ivan Mahonin 0ed2f6
    { assert(!empty()); return *cast(m_begin); }
Ivan Mahonin 0ed2f6
  const value_type& back() const
Ivan Mahonin 0ed2f6
    { assert(!empty()); return *cast(m_rbegin); }
Ivan Mahonin 0ed2f6
};
Ivan Mahonin 0ed2f6
Ivan Mahonin 0ed2f6
#endif