@@ -20,7 +20,7 @@ class array_t {
2020
2121 ptr_t <T> buffer;
2222
23- type::optional <ulong[ 3 ] > get_slice_range ( long x, long y ) const noexcept {
23+ ptr_t <ulong> get_slice_range ( long x, long y ) const noexcept {
2424
2525 if ( empty () || x == y ){ return nullptr ; } if ( y>0 ){ --y; }
2626
@@ -32,13 +32,13 @@ class array_t {
3232 ulong b = clamp ( first () + x, 0UL , a );
3333 ulong c = a - b + 1 ;
3434
35- ulong arr[3 ]; /* ------------ -----------*/
36- arr[0 ] = b; arr[1 ] = a; arr[2 ] = c;
35+ ulong* arr = new ulong [3 ]; /* -----------*/
36+ arr[0 ] = b; arr[1 ] = a; arr[2 ] = c;
3737
38- return arr;
38+ return ptr_t <ulong>( arr, 3 ) ;
3939 }
4040
41- type::optional <ulong[ 3 ] > get_splice_range ( long x, ulong y ) const noexcept {
41+ ptr_t <ulong> get_splice_range ( long x, ulong y ) const noexcept {
4242
4343 if ( empty () || y == 0 ){ return nullptr ; }
4444
@@ -50,10 +50,10 @@ class array_t {
5050 ulong b = clamp ( first () + x, 0UL , a );
5151 ulong c = a - b + 1 ;
5252
53- ulong arr[3 ]; /* ------------ -----------*/
54- arr[0 ] = b; arr[1 ] = a; arr[2 ] = c;
53+ ulong* arr = new ulong [3 ]; /* -----------*/
54+ arr[0 ] = b; arr[1 ] = a; arr[2 ] = c;
5555
56- return arr;
56+ return ptr_t <ulong>( arr, 3 ) ;
5757 }
5858
5959public:
@@ -303,19 +303,19 @@ class array_t {
303303 /* ─······································································─*/
304304
305305 void erase ( ulong index ) noexcept {
306- auto r = get_slice_range ( index, size () ); if ( !r. has_value () ){ return ; }
307- else { auto z = *r. get (); auto n_buffer = ptr_t <T>( size () - 1 );
308- type::copy ( begin ()+z [0 ]+1 , end () , n_buffer.begin ()+z [0 ] );
309- type::copy ( begin () , begin ()+z [0 ], n_buffer.begin () );
306+ auto r = get_slice_range ( index, size () ); if ( r. null () ){ return ; }
307+ else { auto n_buffer = ptr_t <T>( size () - 1 );
308+ type::copy ( begin ()+r [0 ]+1 , end () , n_buffer.begin ()+r [0 ] );
309+ type::copy ( begin () , begin ()+r [0 ], n_buffer.begin () );
310310 buffer = n_buffer;
311311 }
312312 }
313313
314314 void erase ( ulong start, ulong stop ) noexcept {
315- auto r = get_slice_range ( start, stop ); if ( !r. has_value () ){ return ; }
316- else { auto z = *r. get (); auto n_buffer = ptr_t <T>( size () - z [2 ] );
317- type::copy ( begin ()+z [1 ]+1 , end () , n_buffer.begin ()+z [0 ] );
318- type::copy ( begin () , begin ()+z [0 ], n_buffer.begin () );
315+ auto r = get_slice_range ( start, stop ); if ( r. null () ){ return ; }
316+ else { auto n_buffer = ptr_t <T>( size ()-r [2 ] );
317+ type::copy ( begin ()+r [1 ]+1 , end () , n_buffer.begin ()+r [0 ] );
318+ type::copy ( begin () , begin ()+r [0 ], n_buffer.begin () );
319319 buffer = n_buffer;
320320 }
321321 }
@@ -348,11 +348,10 @@ class array_t {
348348 array_t slice ( long start ) const noexcept {
349349
350350 auto r = get_slice_range ( start, size () );
351- if ( !r. has_value () ){ return nullptr ; }
351+ if ( r. null () ){ return nullptr ; }
352352
353- auto z = *r.get ();
354- auto n_buffer = ptr_t <T>( z[2 ] );
355- type::copy ( begin ()+z[0 ], begin ()+z[0 ]+z[2 ], n_buffer.begin () );
353+ auto n_buffer = ptr_t <T>( r[2 ] );
354+ type::copy ( begin ()+r[0 ], begin ()+r[0 ]+r[2 ], n_buffer.begin () );
356355
357356 return n_buffer;
358357 }
@@ -362,11 +361,10 @@ class array_t {
362361 array_t slice ( long start, long stop ) const noexcept {
363362
364363 auto r = get_slice_range ( start, stop );
365- if ( !r. has_value () ){ return nullptr ; }
364+ if ( r. null () ){ return nullptr ; }
366365
367- auto z = *r.get ();
368- auto n_buffer = ptr_t <T>( z[2 ] );
369- type::copy ( begin ()+z[0 ], begin ()+z[0 ]+z[2 ], n_buffer.begin () );
366+ auto n_buffer = ptr_t <T>( r[2 ] );
367+ type::copy ( begin ()+r[0 ], begin ()+r[0 ]+r[2 ], n_buffer.begin () );
370368
371369 return n_buffer;
372370 }
@@ -376,26 +374,24 @@ class array_t {
376374 array_t splice ( long start, ulong stop ) noexcept {
377375
378376 auto r = get_splice_range ( start, stop );
379- if ( !r. has_value () ){ return nullptr ; }
377+ if ( r. null () ){ return nullptr ; }
380378
381- auto z = *r.get ();
382- auto n_buffer = ptr_t <T>( z[2 ] );
383- type::copy ( begin ()+z[0 ], begin ()+z[0 ]+z[2 ], n_buffer.begin () );
379+ auto n_buffer = ptr_t <T>( r[2 ] );
380+ type::copy ( begin ()+r[0 ], begin ()+r[0 ]+r[2 ], n_buffer.begin () );
384381
385- erase ( z [0 ], z [0 ] + z [2 ] ); return n_buffer;
382+ erase ( r [0 ], r [0 ] + r [2 ] ); return n_buffer;
386383 }
387384
388385 template < class V , ulong N >
389386 array_t splice ( long start, ulong stop, const V (&value)[N] ) noexcept {
390387
391388 auto r = get_splice_range ( start, stop );
392- if ( !r. has_value () ){ return nullptr ; }
389+ if ( r. null () ){ return nullptr ; }
393390
394- auto z = *r.get ();
395- auto n_buffer = ptr_t <T>( z[2 ] );
396- type::copy ( begin ()+z[0 ], begin ()+z[0 ]+z[2 ], n_buffer.begin () );
391+ auto n_buffer = ptr_t <T>( r[2 ] );
392+ type::copy ( begin ()+r[0 ], begin ()+r[0 ]+r[2 ], n_buffer.begin () );
397393
398- erase ( z [0 ], z [0 ]+z [2 ] ); insert ( z [0 ], value ); return n_buffer;
394+ erase ( r [0 ], r [0 ]+r [2 ] ); insert ( r [0 ], value ); return n_buffer;
399395
400396 }
401397
0 commit comments