added std::move to reserve, insert, erase for better array resizing behavior with resource managing objects - need to test with reosurce managing objects

This commit is contained in:
2026-03-20 11:27:26 -04:00
parent 54fedb6a26
commit 9409daefb4
9 changed files with 141 additions and 18 deletions

Binary file not shown.

View File

@ -39,12 +39,12 @@ namespace ams
amsarray_size_t lmin = 0;
T defval = T();
void* test_ptr = malloc(16);
if(test_ptr) free(test_ptr);
else {
printf("HEAP CORRUPTED before reserve()!\n");
return amsarray_failure;
}
// void* test_ptr = malloc(16);
// if(test_ptr) free(test_ptr);
// else {
// printf("HEAP CORRUPTED before reserve()!\n");
// return amsarray_failure;
// }
if(_newcap<=0)
{
@ -73,7 +73,8 @@ namespace ams
if(data!=NULL)
{
lmin = (_newcap>=reserved) ? reserved : _newcap;
ams::buffer_cast_copy<T,T>(newdata,data,lmin);
//ams::buffer_cast_copy<T,T>(newdata,data,lmin);
ams::buffer_cast_move<T,T>(newdata,data,lmin);
}
//ams::buffer_set<T>(newdata,reserved,_newcap,defval);
@ -437,7 +438,7 @@ template<typename T> int amsarray<T>::insert(amsarray_size_t ind, const T& val)
for(I=oldlen;I>=ind+1;I--)
{
this->data[I] = this->data[I-1];
this->data[I] = std::move(this->data[I-1]);
}
this->data[ind] = val;
}
@ -501,7 +502,7 @@ template<typename T> int amsarray<T>::insert(amsarray_size_t ind, const amsarray
{
for(I=oldlen;I>=ind+other.length;I--)
{
this->data[I] = this->data[I-1];
this->data[I] = std::move(this->data[I-1]);
}
for(I=ind;I<ind+other.length;I++)
{
@ -568,7 +569,7 @@ template<typename T> int amsarray<T>::erase(amsarray_size_t ind)
{
for(I=ind;I<this->length-1;I++)
{
this->data[I] = this->data[I+1];
this->data[I] = std::move(this->data[I+1]);
}
this->data[this->length-1] = T();
}

View File

@ -31,6 +31,23 @@ namespace ams
//threaded copy of bufferfrom to bufferto
template<typename T1, typename T2> int buffer_cast_copy_unthreaded(T1* bufferto, const T2* bufferfrom, buffer_size_t N);
//threaded std::move of bufferfrom[offsetfrom + I] to bufferto[offsetto+I] I = [0,N)
template<typename T1, typename T2> int buffer_cast_move(T1* bufferto, const T2* bufferfrom,
buffer_size_t offsetto, buffer_size_t offsetfrom, buffer_size_t N);
//threaded std::move of bufferfrom to bufferto
template<typename T1, typename T2> int buffer_cast_move(T1* bufferto, const T2* bufferfrom, buffer_size_t N);
//threaded std::move of bufferfrom[offsetfrom + I] to bufferto[offsetto+I] I = [0,N)
template<typename T1, typename T2> int buffer_cast_move_unthreaded(T1* bufferto, const T2* bufferfrom,
buffer_size_t offsetto, buffer_size_t offsetfrom, buffer_size_t N);
//threaded std::move of bufferfrom to bufferto
template<typename T1, typename T2> int buffer_cast_move_unthreaded(T1* bufferto, const T2* bufferfrom, buffer_size_t N);
}; //end namespace ams
#include <amsmathutil25/util/amsmathutil25_bufferops_impl.hpp>

View File

@ -225,6 +225,111 @@ namespace ams
}
////////////////////
//buffer_cast_move//
////////////////////
template<typename T1, typename T2> void buffer_cast_move_tf(
int threadnum,
int nthread,
T1 *bufferto,
const T2 *bufferfrom,
buffer_size_t offsetto,
buffer_size_t offsetfrom,
buffer_size_t N
)
{
buffer_size_t I,I0,I1,Is;
// Is = N/(nthread-1);
// Is = (Is<=0) ? 1 : Is;
// I0 = Is*(threadnum);
// I1 = Is*(threadnum+1);
// I0 = (I0<=0) ? 0 : I0;
// I1 = (I1<=0) ? 0 : I1;
// I0 = (I0>N) ? N : I0;
// I1 = (I1>N) ? N : I1;
Is = (nthread<=0) ? N : N/nthread;
I0 = Is*(threadnum);
I1 = (threadnum>=(nthread-1)) ? N : Is*(threadnum+1);
// I0 = (I0<=0) ? 0 : I0;
// I1 = (I1<=0) ? 0 : I1;
I0 = (I0>N) ? N : I0;
I1 = (I1>N) ? N : I1;
for(I=I0;I<I1;I++)
{
bufferto[I + offsetto] = std::move((T1) (bufferfrom[I + offsetfrom]));
}
return;
}
//threaded copy of bufferfrom[offsetfrom + I] to bufferto[offsetto+I] I = [0,N)
template<typename T1, typename T2> int buffer_cast_move(T1* bufferto, const T2* bufferfrom,
buffer_size_t offsetto, buffer_size_t offsetfrom, buffer_size_t N)
{
int ret = amsmathutil25_success;
int res;
res = ams::threaded_execute(
&buffer_cast_copy_tf<T1,T2>,(int64_t) N,
bufferto,bufferfrom,offsetto,offsetfrom,N
);
ret = res;
return ret;
}
//threaded copy of bufferfrom to bufferto
template<typename T1, typename T2> int buffer_cast_move(T1* bufferto, const T2* bufferfrom, buffer_size_t N)
{
int ret = amsmathutil25_success;
buffer_size_t I;
if(N<amsmathutil25_threadpsz)
{
for(I=0;I<N;I++) bufferto[I] = (T1) bufferfrom[I];
}
else
{
ret = buffer_cast_copy<T1,T2>(bufferto,bufferfrom,0,0,N);
}
return ret;
}
//threaded copy of bufferfrom[offsetfrom + I] to bufferto[offsetto+I] I = [0,N)
template<typename T1, typename T2> int buffer_cast_move_unthreaded(T1* bufferto, const T2* bufferfrom,
buffer_size_t offsetto, buffer_size_t offsetfrom, buffer_size_t N)
{
int ret = amsmathutil25_success;
buffer_size_t I;
for(I=0;I<N;I++)
{
bufferto[I+offsetto] = std::move((T1) bufferfrom[I+offsetfrom]);
}
return ret;
}
//threaded copy of bufferfrom to bufferto
template<typename T1, typename T2> int buffer_cast_move_unthreaded(T1* bufferto, const T2* bufferfrom, buffer_size_t N)
{
int ret = amsmathutil25_success;
buffer_size_t I;
for(I=0;I<N;I++)
{
bufferto[I] = std::move((T1) bufferfrom[I]);
}
return ret;
}
}; //end namespace ams
#endif

View File

@ -8,14 +8,14 @@ int main(int argc, char* argv[])
int ret = 0;
printf("ams c++ math and utility library tests.\n");
//ams::amsmathutil25::test_amsarray1();
//ams::amsmathutil25::test_amsarray2();
//ams::amsmathutil25::test_amsarray_select();
//ams::amsmathutil25::test_amsarray_sort1();
//test_amsarray_insertdelete1();
//test_amsarray_insertdelete2();
//test_amsarray_minimal();
//test_amsarray_arrayinsert();
ams::amsmathutil25::test_amsarray1();
ams::amsmathutil25::test_amsarray2();
ams::amsmathutil25::test_amsarray_select();
ams::amsmathutil25::test_amsarray_sort1();
test_amsarray_insertdelete1();
test_amsarray_insertdelete2();
test_amsarray_minimal();
test_amsarray_arrayinsert();
return ret;