A Tcl like command language made for the Clinl kernel testing
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

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