- Timestamp:
- Feb 6, 2025, 2:50:36 PM (2 months ago)
- Branches:
- master
- Children:
- cd28605
- Parents:
- 301e9f7
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified libcfa/src/collections/vector2.hfa ¶
r301e9f7 ra8e2215 13 13 // Update Count : 2 14 14 // 15 16 // This libcfa header and the vector-demo test form a standalone POC. 17 // The 'vector' is really a host for a style of iterator. 18 // The iterators represent a style proposed to be part of "how CFA collections should do iterators." 19 // The vector API is not built out, beyond what's needed to test the iterators. 15 20 16 21 #pragma once … … 75 80 void ?{}( vector_exit(T) &, vector(T) * ) = void; 76 81 77 void ^?{}( vector_exit(T) & );78 82 void ?{}( vector_exit(T) &, vector_transit(T) & ); 79 83 void ?{}( vector_exit(T) &, vector_exit(T) & ); 84 void ^?{}( vector_exit(T) & ); 80 85 81 86 T ?`val( vector_exit(T) & src ); 82 87 void ?=?( vector_exit(T) & dst, T val ); 83 T & ?=?( T & dst, vector_exit(T) & src ); 84 void ?*=?( T & dst, vector_exit(T) & src ); 88 void ?*=?( T & dst, vector_exit(T) & src ); // wish it were ?=?, but that's not working 85 89 86 90 bool ?`moveNext( vector_exit(T) & it ); … … 141 145 void ^?{}( vector_transit(T) & ) {} 142 146 143 144 vector_transit(T) ?[?]( vector( T ) & vec, ptrdiff_t idx ) {145 // call autogen constructor deleted at end of hfa146 vector_transit(T) ret = { & vec, idx };147 return ret;148 }149 147 150 148 T & findElemMem_$( vector(T) & v, ptrdiff_t idx ) { … … 176 174 this.invec_$->exit_refcount_$ ++; 177 175 } 176 178 177 void ?{}( vector_exit(T) & this, vector_exit(T) & src ){ 179 178 ( this.invec_$ ){ src.invec_$ }; … … 189 188 T ?`val( vector_exit(T) & src ) { 190 189 return *src.item_$; 190 } 191 192 void ?=?( vector_exit(T) & dst, T val ) { 193 *dst.item_$ = val; 191 194 } 192 195 … … 243 246 // vec internals 244 247 245 void grow ( vector( T ) & this ) {248 void grow_$( vector( T ) & this ) { 246 249 size_t newCapacity = 2 * (this.buffer_end_$ - this.buffer_first_$); 247 250 T * newItems = aalloc( newCapacity ); … … 263 266 } 264 267 268 bool inRange_$( T * query, T * from, T * to) { 269 if (from == to) return false; 270 if (from < to) return from <= query && query < to; 271 return query < to || from <= query; 272 } 273 265 274 // vec api 266 275 … … 269 278 if (col`length >= col`capacity) { 270 279 assert (col`length == col`capacity); 271 grow (col);280 grow_$(col); 272 281 } 273 282 // call autogen constructor deleted at end of hfa … … 280 289 } 281 290 291 vector_transit(T) ?[?]( vector( T ) & vec, ptrdiff_t idx ) { 292 // call autogen constructor deleted at end of hfa 293 vector_transit(T) ret = { & vec, idx }; 294 return ret; 295 } 296 282 297 vector_exit(T) ?`origin( vector( T ) & vec ) { 283 298 … … 294 309 } 295 310 296 bool inRange_$( T * query, T * from, T * to) { 297 if (from == to) return false; 298 if (from < to) return from <= query && query < to; 299 return query < to || from <= query; 311 size_t ?`capacity( vector(T) & v ) { 312 return v.buffer_end_$ - v.buffer_first_$; 313 } 314 315 size_t ?`length( vector(T) & v ) { 316 if (v.elems_first_$ == 0p) return 0; 317 if (v.elems_first_$ < v.elems_end_$ ) return v.elems_end_$ - v.elems_first_$; 318 return v.buffer_end_$ - v.elems_first_$ + v.elems_end_$ - v.buffer_first_$; 300 319 } 301 320 … … 304 323 if (col`length >= col`capacity) { 305 324 assert (col`length == col`capacity); 306 grow (col);325 grow_$(col); 307 326 } 308 327 … … 339 358 } 340 359 341 size_t ?`capacity( vector(T) & v ) {342 return v.buffer_end_$ - v.buffer_first_$;343 }344 345 size_t ?`length( vector(T) & v ) {346 if (v.elems_first_$ == 0p) return 0;347 if (v.elems_first_$ < v.elems_end_$ ) return v.elems_end_$ - v.elems_first_$;348 return v.buffer_end_$ - v.elems_first_$ + v.elems_end_$ - v.buffer_first_$;349 }350 351 352 360 } // forall T 353 361
Note: See TracChangeset
for help on using the changeset viewer.