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;
};