A Tcl like command language made for the Clinl kernel testing
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

136 lines
1.8 KiB

#pragma once
#include <stddef.h>
#include "container.hpp"
namespace __internals{
template<typename T>
T& ref(T& n)
{
return n;
}
template<class T>
struct r_op_iterator
{
r_op_iterator(T* in):it(in){}
T* it;
auto operator++()
{
return it--;
}
auto operator++(int)
{
return --it;
}
auto operator--()
{
return it--;
}
auto operator--(int)
{
return --it;
}
T& operator*()
{
return *it;
}
T& operator[](const size_t idx)
{
return *(it-idx);
}
auto operator==(const r_op_iterator& rhs)
{
return it==rhs.it;
}
auto operator!=(const r_op_iterator& rhs)
{
return it!=rhs.it;
}
auto operator<=(const r_op_iterator& rhs)
{
return (rhs.it<=it);
}
auto operator>=(const r_op_iterator& rhs)
{
return (rhs.it>=it);
}
auto operator<(const r_op_iterator& rhs)
{
return (rhs.it<it);
}
auto operator>(const r_op_iterator& rhs)
{
return (rhs.it>it);
}
};
}
namespace ksdk{
template<typename T>
class buffer : public typed_container<T>
{
protected:
T* _buffer;
size_t _size;
public:
constexpr buffer(T* b, T* e)
:_buffer(b)
,_size(e-b)
{
}
constexpr buffer()
:_buffer(nullptr)
,_size(0)
{
}
constexpr buffer(T* b, size_t sz)
:_buffer(b)
,_size(sz)
{
}
size_t size()
{
return _size;
}
T* begin()
{
return _buffer;
}
T* end()
{
return _buffer+_size;
}
__internals::r_op_iterator<T> rbegin()
{
return __internals::r_op_iterator<T>(_buffer-1+_size);
}
__internals::r_op_iterator<T> rend()
{
return __internals::r_op_iterator<T>(_buffer-1);
}
T& operator[](size_t idx)
{
return _buffer[idx];
}
bool operator==(buffer<T> oth)
{
if(size()!=oth.size())
return false;
for(size_t i=0; i<size(); i++)
if(_buffer[i]!=oth[i])
return false;
return true;
}
};
}