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:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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();
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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
|
||||
|
||||
16
src/main.cpp
16
src/main.cpp
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user