LpRange safe ranged pointer
От: Caracrist https://1pwd.org/
Дата: 07.12.10 19:35
Оценка:
class LpRange
{
public:
  LpRange() : m_begin(NULL), m_end(NULL){}
  LpRange(const LpRange& src) : m_begin(src.m_begin), m_end(src.m_end) {}
  LpRange(void * begin, void * end) { Assign(begin, end); }
  LpRange(void * begin, size_t size) { Assign(begin, (void*)((char*)begin + size)); }

  LpRange & operator=(const LpRange& src){
    Assign(src.m_begin, src.m_end);
    return *this; 
  }
  LpRange operator + (size_t size) const
  {
    return LpRange((void*)((char*)m_begin + size), m_end);
  }
  LpRange &operator += (size_t size) 
  {
    return *this = *this + size;
  }
  template<class T>
  operator T* () const {
    return (Contains<T>())?(T*)m_begin:(T*)NULL;
  }
  operator void* () const {
    return Begin();
  }
  void Assign(void * begin, void * end){
    if (begin == NULL || begin > end)
    {
      m_begin = m_end = NULL;
      return;
    }
    // else
    m_begin = begin;
    m_end = end;
  }
  void * Begin() const { return m_begin; }
  void * End() const { return m_end; }
  size_t Size() const { return (char*)m_end - (char*)m_begin; }
  bool IsEmpty() const { return Size() == 0; }
  template<class T>
  bool Contains(size_t count = 1) const { return Size() >= sizeof(T) * count; }
  bool Assigned() const { return m_begin != NULL; }
private:
  void *m_begin, *m_end;
};
~~~~~
~lol~~
~~~ Single Password Solution
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.