array insertions
This commit is contained in:
BIN
build/__pycache__/amsbuildlib4.cpython-311.pyc
Normal file
BIN
build/__pycache__/amsbuildlib4.cpython-311.pyc
Normal file
Binary file not shown.
@ -14,7 +14,7 @@ depdir = "./dependencies/linux64" #local pre-compiled dependency libraries and t
|
|||||||
installdir = "../../linux64" #directory to install to when finished
|
installdir = "../../linux64" #directory to install to when finished
|
||||||
builddir = "./build_linux64"
|
builddir = "./build_linux64"
|
||||||
|
|
||||||
doinstall = False #copies the build_output to the install dir when finished
|
doinstall = True #copies the build_output to the install dir when finished
|
||||||
cc = "g++" #compiler
|
cc = "g++" #compiler
|
||||||
cflags = "-O3 -fPIC"
|
cflags = "-O3 -fPIC"
|
||||||
libraries = "-l{}".format(libname)
|
libraries = "-l{}".format(libname)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -14,6 +14,7 @@ namespace amsmathutil25
|
|||||||
void test_amsarray_insertdelete1();
|
void test_amsarray_insertdelete1();
|
||||||
void test_amsarray_insertdelete2();
|
void test_amsarray_insertdelete2();
|
||||||
void test_amsarray_minimal();
|
void test_amsarray_minimal();
|
||||||
|
void test_amsarray_arrayinsert();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -79,6 +79,10 @@ namespace ams
|
|||||||
T pop_back();
|
T pop_back();
|
||||||
T pop_front();
|
T pop_front();
|
||||||
|
|
||||||
|
int insert(amsarray_size_t ind, const amsarray<T>& other);
|
||||||
|
int append(const amsarray<T>& other);
|
||||||
|
|
||||||
|
|
||||||
//finds the first instance of val in the array
|
//finds the first instance of val in the array
|
||||||
amsarray_size_t find(const T& val);
|
amsarray_size_t find(const T& val);
|
||||||
|
|
||||||
|
|||||||
@ -470,6 +470,87 @@ template<typename T> int amsarray<T>::insert(amsarray_size_t ind, const T& val)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T> int amsarray<T>::insert(amsarray_size_t ind, const amsarray<T>& other)
|
||||||
|
{
|
||||||
|
int ret = amsarray_success;
|
||||||
|
|
||||||
|
int res;
|
||||||
|
amsarray_size_t I, oldlen;
|
||||||
|
amsarray_size_t I0,I1;
|
||||||
|
|
||||||
|
if(other.length==0)
|
||||||
|
{
|
||||||
|
ret = amsarray_success;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ind<0)
|
||||||
|
{
|
||||||
|
ret = amsarray_failure;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
else if(ind<=this->length)
|
||||||
|
{
|
||||||
|
oldlen = this->length;
|
||||||
|
res = this->resize_insert(this->length + other.length);
|
||||||
|
if(res==amsarray_success)
|
||||||
|
{
|
||||||
|
//for now, do things single threaded.
|
||||||
|
//to do things multithreaded, I'd need another buffer
|
||||||
|
if(this->data!=NULL && other.data!=NULL)
|
||||||
|
{
|
||||||
|
for(I=oldlen;I>=ind+other.length;I--)
|
||||||
|
{
|
||||||
|
this->data[I] = this->data[I-1];
|
||||||
|
}
|
||||||
|
for(I=ind;I<ind+other.length;I++)
|
||||||
|
{
|
||||||
|
this->data[I] = other.data[I-ind];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret = amsarray_success;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = amsarray_failure;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//inserting past the end of the array
|
||||||
|
res = this->resize_insert(ind+other.length);
|
||||||
|
if(res!=amsarray_success)
|
||||||
|
{
|
||||||
|
ret = amsarray_failure;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(this->data !=NULL && other.data !=NULL)
|
||||||
|
{
|
||||||
|
for(I=ind;I<ind+other.length;I++)
|
||||||
|
{
|
||||||
|
this->data[I] = other.data[I-ind];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret = amsarray_success;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T> int amsarray<T>::append(const amsarray<T> &other)
|
||||||
|
{
|
||||||
|
int ret = amsarray_success;
|
||||||
|
|
||||||
|
ret = insert(length,other);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
//removes the value at index ind, and reduces array size by 1
|
//removes the value at index ind, and reduces array size by 1
|
||||||
template<typename T> int amsarray<T>::erase(amsarray_size_t ind)
|
template<typename T> int amsarray<T>::erase(amsarray_size_t ind)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -9,6 +9,12 @@ namespace ams
|
|||||||
//psize must be supplied to determine whether to execute in threaded mode or not.
|
//psize must be supplied to determine whether to execute in threaded mode or not.
|
||||||
template<typename callable, typename ... argst> int threaded_execute(callable &&fptr, int64_t psize, argst&&... args);
|
template<typename callable, typename ... argst> int threaded_execute(callable &&fptr, int64_t psize, argst&&... args);
|
||||||
|
|
||||||
|
|
||||||
|
//A template function that takes as input a function pointer and a series of arguments
|
||||||
|
//The function is executed with fptr(threadnum, nthreads, otherargs...) with a given number of threads
|
||||||
|
template<typename callable, typename ... argst> int numthreaded_execute(callable &&fptr, int nthreads, argst&&... args);
|
||||||
|
|
||||||
|
|
||||||
template<typename T1, typename T2> struct pair
|
template<typename T1, typename T2> struct pair
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|||||||
@ -68,6 +68,56 @@ template<typename callable, typename ... argst> int threaded_execute(callable &&
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//A template function that takes as input a function pointer and a series of arguments
|
||||||
|
//The function is executed with fptr(threadnum, nthreads, otherargs...) with a given number of threads
|
||||||
|
template<typename callable, typename ... argst> int numthreaded_execute(callable &&fptr, int nthreads, argst&&... args)
|
||||||
|
{
|
||||||
|
int ret = amsmathutil25_success;
|
||||||
|
int I;
|
||||||
|
std::vector<std::thread*> threads;
|
||||||
|
|
||||||
|
if(nthreads<=1)
|
||||||
|
{
|
||||||
|
nthreads = 1;
|
||||||
|
I = 0;
|
||||||
|
fptr(I,nthreads,std::forward<argst>(args)...);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
threads.resize(nthreads);
|
||||||
|
for(I=0;I<nthreads;I++) threads[I] = NULL;
|
||||||
|
for(I=0;I<nthreads;I++)
|
||||||
|
{
|
||||||
|
threads[I] = new(std::nothrow) std::thread
|
||||||
|
(
|
||||||
|
std::forward<callable>(fptr),
|
||||||
|
I,
|
||||||
|
nthreads,
|
||||||
|
std::forward<argst>(args)...
|
||||||
|
);
|
||||||
|
}
|
||||||
|
for(I=0;I<nthreads;I++)
|
||||||
|
{
|
||||||
|
if(threads[I]==NULL)
|
||||||
|
{ //null thread creation failure check
|
||||||
|
//printf("debug check!\n");
|
||||||
|
ret = amsmathutil25_failure;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(I=0;I<nthreads;I++)
|
||||||
|
{
|
||||||
|
if(threads[I]!=NULL)
|
||||||
|
{
|
||||||
|
threads[I]->join();
|
||||||
|
delete threads[I];
|
||||||
|
threads[I] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
}; //end namespace ams
|
}; //end namespace ams
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -293,7 +293,33 @@ void test_amsarray_minimal()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_amsarray_arrayinsert()
|
||||||
|
{
|
||||||
|
amsarray<int> q1,q2,q3;
|
||||||
|
int I;
|
||||||
|
|
||||||
|
q1 = {1,2,3,4,5};
|
||||||
|
q2 = {0,0,1,0};
|
||||||
|
|
||||||
|
q3 = q1;
|
||||||
|
|
||||||
|
printf("Array append test\n");
|
||||||
|
printf("q3="); q3.print(1);
|
||||||
|
printf("q2="); q2.print(1);
|
||||||
|
q3.append(q2);
|
||||||
|
printf("q3+q2="); q3.print(1);
|
||||||
|
|
||||||
|
printf("q3="); q3.print(1);
|
||||||
|
printf("q2="); q2.print(1);
|
||||||
|
for(I=-2;I<q1.length+2;I++)
|
||||||
|
{
|
||||||
|
q3 = q1;
|
||||||
|
q3.insert(I,q2);
|
||||||
|
printf("q3.insert(%d,q2)=",I); q3.print(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}; //end namespace amsmathutil25
|
}; //end namespace amsmathutil25
|
||||||
|
|||||||
@ -14,7 +14,8 @@ int main(int argc, char* argv[])
|
|||||||
//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();
|
||||||
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
Reference in New Issue
Block a user