26 #include "../my_config.h" 62 cellule() : next(
nullptr), prev(
nullptr), data(
nullptr), size(0) {};
63 struct cellule *next, *prev;
70 { make_alloc(size, first, last); };
79 { detruit(first); copy_from(val);
return *
this; };
81 bool operator < (
const storage & ref)
const 82 {
return difference(ref) < 0; };
83 bool operator == (
const storage & ref)
const 84 {
return difference(ref) == 0; };
85 bool operator > (
const storage & ref)
const 86 {
return difference(ref) > 0; };
87 bool operator <= (
const storage & ref)
const 88 {
return difference(ref) <= 0; };
89 bool operator >= (
const storage & ref)
const 90 {
return difference(ref) >= 0; };
91 bool operator != (
const storage & ref)
const 92 {
return difference(ref) != 0; };
93 unsigned char & operator [](
infinint position);
94 unsigned char operator [](
const infinint & position)
const;
96 void clear(
unsigned char val = 0);
102 iterator() : ref(
nullptr), cell(
nullptr), offset(0) {};
107 iterator operator ++ (S_I x)
108 { iterator ret = *
this; skip_plus_one();
return ret; };
109 iterator operator -- (S_I x)
110 { iterator ret = *
this; skip_less_one();
return ret; };
111 iterator & operator ++ ()
112 { skip_plus_one();
return *
this; };
113 iterator & operator -- ()
114 { skip_less_one();
return *
this; };
115 iterator operator + (U_32 s)
const 116 { iterator ret = *
this; ret += s;
return ret; };
117 iterator operator - (U_32 s)
const 118 { iterator ret = *
this; ret -= s;
return ret; };
120 iterator & operator -= (U_32 s);
121 unsigned char &operator *()
const;
126 bool operator == (
const iterator & cmp)
const 127 {
return ref == cmp.ref && cell == cmp.cell && offset == cmp.offset; };
128 bool operator != (
const iterator & cmp)
const 129 {
return ! (*
this == cmp); };
132 static const U_32 OFF_BEGIN = 1;
133 static const U_32 OFF_END = 2;
136 struct cellule *cell;
139 void relative_skip_to(S_32 val);
140 bool points_on_data()
const 141 {
return ref !=
nullptr && cell !=
nullptr && offset < cell->size; };
143 inline void skip_plus_one();
144 inline void skip_less_one();
151 iterator begin()
const 152 { iterator ret; ret.cell = first;
if(ret.cell !=
nullptr) ret.offset = 0;
else ret.offset = iterator::OFF_END; ret.ref =
this;
return ret; };
154 { iterator ret; ret.cell =
nullptr; ret.offset = iterator::OFF_END; ret.ref =
this;
return ret; };
160 iterator rbegin()
const 161 { iterator ret; ret.cell = last; ret.offset = last !=
nullptr ? last->size-1 : 0; ret.ref =
this;
return ret; };
162 iterator rend()
const 163 { iterator ret; ret.cell =
nullptr, ret.offset = iterator::OFF_BEGIN; ret.ref =
this;
return ret; };
170 U_I
write(iterator & it,
unsigned char *a, U_I size);
171 U_I read(iterator & it,
unsigned char *a, U_I size)
const;
172 bool write(iterator & it,
unsigned char a)
173 {
return write(it, &a, 1) == 1; };
174 bool read(iterator & it,
unsigned char &a)
const 175 {
return read(it, &a, 1) == 1; };
178 void insert_null_bytes_at_iterator(iterator it, U_I size);
179 void insert_const_bytes_at_iterator(iterator it,
unsigned char a, U_I size);
180 void insert_bytes_at_iterator(iterator it,
unsigned char *a, U_I size);
181 void insert_as_much_as_necessary_const_byte_to_be_as_wider_as(
const storage & ref,
const iterator & it,
unsigned char value);
182 void remove_bytes_at_iterator(iterator it, U_I number);
183 void remove_bytes_at_iterator(iterator it,
infinint number);
186 struct cellule *first, *last;
188 void copy_from(
const storage & ref);
189 S_32 difference(
const storage & ref)
const;
191 void insert_bytes_at_iterator_cmn(iterator it,
bool constant,
unsigned char *a, U_I size);
192 void fusionne(
struct cellule *a_first,
struct cellule *a_last,
struct cellule *b_first,
struct cellule *b_last,
193 struct cellule *&res_first,
struct cellule * & res_last);
199 void detruit(
struct cellule *c);
200 void make_alloc(U_32 size,
struct cellule * & begin,
struct cellule * & end);
201 void make_alloc(
infinint size, cellule * & begin,
struct cellule * & end);
203 friend class storage::iterator;
206 inline void storage::iterator::skip_plus_one()
209 if(++offset >= cell->size)
219 inline void storage::iterator::skip_less_one()
229 offset = cell->size - 1;
are defined here basic integer types that tend to be portable
U_I write(iterator &it, unsigned char *a, U_I size)
write data to the storage at the location pointed to by it
arbitrary large storage structure
contains all the excetion class thrown by libdar
switch module to limitint (32 ou 64 bits integers) or infinint
exception used to signal a bug. A bug is triggered when reaching some code that should never be reach...
this is the interface class from which all other data transfer classes inherit
this is the base class of object that can be allocated on a memory pool
the arbitrary large positive integer class
libdar namespace encapsulate all libdar symbols