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