26 #include "../my_config.h"
62 cellule() : next(NULL), prev(NULL), data(NULL), 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(NULL), cell(NULL), 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 != NULL && cell != NULL && 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 != NULL) ret.offset = 0;
else ret.offset = iterator::OFF_END; ret.ref =
this;
return ret; };
154 { iterator ret; ret.cell = NULL; ret.offset = iterator::OFF_END; ret.ref =
this;
return ret; };
160 iterator rbegin()
const
161 { iterator ret; ret.cell = last; ret.offset = last != NULL ? last->size-1 : 0; ret.ref =
this;
return ret; };
162 iterator rend()
const
163 { iterator ret; ret.cell = NULL, 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);
185 #ifdef LIBDAR_SPECIAL_ALLOC
189 struct cellule *first, *last;
191 void copy_from(
const storage & ref);
192 S_32 difference(
const storage & ref)
const;
194 void insert_bytes_at_iterator_cmn(iterator it,
bool constant,
unsigned char *a, U_I size);
195 void fusionne(
struct cellule *a_first,
struct cellule *a_last,
struct cellule *b_first,
struct cellule *b_last,
196 struct cellule *&res_first,
struct cellule * & res_last);
202 static void detruit(
struct cellule *c);
203 static void make_alloc(U_32 size,
struct cellule * & begin,
struct cellule * & end);
204 static void make_alloc(
infinint size, cellule * & begin,
struct cellule * & end);
206 friend class storage::iterator;
209 inline void storage::iterator::skip_plus_one()
212 if(++offset >= cell->size)
222 inline void storage::iterator::skip_less_one()
232 offset = cell->size - 1;