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