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; amsarray_size_t lmin = 0;
T defval = T(); T defval = T();
void* test_ptr = malloc(16); // void* test_ptr = malloc(16);
if(test_ptr) free(test_ptr); // if(test_ptr) free(test_ptr);
else { // else {
printf("HEAP CORRUPTED before reserve()!\n"); // printf("HEAP CORRUPTED before reserve()!\n");
return amsarray_failure; // return amsarray_failure;
} // }
if(_newcap<=0) if(_newcap<=0)
{ {
@ -73,7 +73,8 @@ namespace ams
if(data!=NULL) if(data!=NULL)
{ {
lmin = (_newcap>=reserved) ? reserved : _newcap; 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); //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--) 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; 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--) 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++) 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++) 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(); this->data[this->length-1] = T();
} }

View File

@ -31,6 +31,23 @@ namespace ams
//threaded copy of bufferfrom to bufferto //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); 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 }; //end namespace ams
#include <amsmathutil25/util/amsmathutil25_bufferops_impl.hpp> #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 }; //end namespace ams
#endif #endif

View File

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