diff --git a/build_linux64/libamsmathutil25.linux64.a b/build_linux64/libamsmathutil25.linux64.a index abc5ab4..d7f4cf5 100644 Binary files a/build_linux64/libamsmathutil25.linux64.a and b/build_linux64/libamsmathutil25.linux64.a differ diff --git a/build_linux64/objstore/amscpptemplate25a_src2.o b/build_linux64/objstore/amscpptemplate25a_src2.o new file mode 100644 index 0000000..03a41ce Binary files /dev/null and b/build_linux64/objstore/amscpptemplate25a_src2.o differ diff --git a/build_linux64/objstore/amscpptemplate25a_template.o b/build_linux64/objstore/amscpptemplate25a_template.o new file mode 100644 index 0000000..1fc5d71 Binary files /dev/null and b/build_linux64/objstore/amscpptemplate25a_template.o differ diff --git a/build_linux64/objstore/amsmathtuil25_test1.o b/build_linux64/objstore/amsmathtuil25_test1.o new file mode 100644 index 0000000..2646f57 Binary files /dev/null and b/build_linux64/objstore/amsmathtuil25_test1.o differ diff --git a/build_linux64/objstore/amsmathutiil25_random.o b/build_linux64/objstore/amsmathutiil25_random.o new file mode 100644 index 0000000..bf4ea4d Binary files /dev/null and b/build_linux64/objstore/amsmathutiil25_random.o differ diff --git a/build_linux64/objstore/amsmathutil25_amsarray.o b/build_linux64/objstore/amsmathutil25_amsarray.o new file mode 100644 index 0000000..4c01ecf Binary files /dev/null and b/build_linux64/objstore/amsmathutil25_amsarray.o differ diff --git a/build_linux64/objstore/amsmathutil25_amsarray_sort.o b/build_linux64/objstore/amsmathutil25_amsarray_sort.o new file mode 100644 index 0000000..d509bc5 Binary files /dev/null and b/build_linux64/objstore/amsmathutil25_amsarray_sort.o differ diff --git a/build_linux64/objstore/amsmathutil25_mathfns1.o b/build_linux64/objstore/amsmathutil25_mathfns1.o new file mode 100644 index 0000000..7def272 Binary files /dev/null and b/build_linux64/objstore/amsmathutil25_mathfns1.o differ diff --git a/build_linux64/objstore/amsmathutil25_utils1.o b/build_linux64/objstore/amsmathutil25_utils1.o new file mode 100644 index 0000000..9232ac3 Binary files /dev/null and b/build_linux64/objstore/amsmathutil25_utils1.o differ diff --git a/build_linux64/objstore/amsmathutil25_vec2.o b/build_linux64/objstore/amsmathutil25_vec2.o new file mode 100644 index 0000000..93f1c86 Binary files /dev/null and b/build_linux64/objstore/amsmathutil25_vec2.o differ diff --git a/build_linux64/objstore/amsmathutil25_vec2f.o b/build_linux64/objstore/amsmathutil25_vec2f.o new file mode 100644 index 0000000..57543d2 Binary files /dev/null and b/build_linux64/objstore/amsmathutil25_vec2f.o differ diff --git a/build_linux64/objstore/amsmathutil25_vec3.o b/build_linux64/objstore/amsmathutil25_vec3.o new file mode 100644 index 0000000..6cbc0a1 Binary files /dev/null and b/build_linux64/objstore/amsmathutil25_vec3.o differ diff --git a/build_linux64/objstore/amsmathutil25_vec3f.o b/build_linux64/objstore/amsmathutil25_vec3f.o new file mode 100644 index 0000000..3ca6459 Binary files /dev/null and b/build_linux64/objstore/amsmathutil25_vec3f.o differ diff --git a/build_linux64/objstore/amsmathutil25_vec4.o b/build_linux64/objstore/amsmathutil25_vec4.o new file mode 100644 index 0000000..65910fc Binary files /dev/null and b/build_linux64/objstore/amsmathutil25_vec4.o differ diff --git a/build_linux64/objstore/amsmathutil25_vec4f.o b/build_linux64/objstore/amsmathutil25_vec4f.o new file mode 100644 index 0000000..6eb0c53 Binary files /dev/null and b/build_linux64/objstore/amsmathutil25_vec4f.o differ diff --git a/build_linux64/objstore/amsmathutil2t_complex128.o b/build_linux64/objstore/amsmathutil2t_complex128.o new file mode 100644 index 0000000..be57f9f Binary files /dev/null and b/build_linux64/objstore/amsmathutil2t_complex128.o differ diff --git a/build_linux64/objstore/amsmathutil2t_complex64.o b/build_linux64/objstore/amsmathutil2t_complex64.o new file mode 100644 index 0000000..e2bbf48 Binary files /dev/null and b/build_linux64/objstore/amsmathutil2t_complex64.o differ diff --git a/build_linux64/tests b/build_linux64/tests index 489b03b..d2765c8 100644 Binary files a/build_linux64/tests and b/build_linux64/tests differ diff --git a/include/amsmathutil25/testing/amsmathutil25_testing.hpp b/include/amsmathutil25/testing/amsmathutil25_testing.hpp index 488b96d..636a7b6 100644 --- a/include/amsmathutil25/testing/amsmathutil25_testing.hpp +++ b/include/amsmathutil25/testing/amsmathutil25_testing.hpp @@ -11,6 +11,7 @@ namespace amsmathutil25 void test_amsarray_sort(); void test_amsarray_select(); void test_amsarray_sort1(); + void test_amsarray_insertdelete1(); diff --git a/include/amsmathutil25/util/amsmathutil25_amsarray.hpp b/include/amsmathutil25/util/amsmathutil25_amsarray.hpp index d0a696b..e95ce52 100644 --- a/include/amsmathutil25/util/amsmathutil25_amsarray.hpp +++ b/include/amsmathutil25/util/amsmathutil25_amsarray.hpp @@ -13,6 +13,9 @@ namespace ams { public: amsarray_size_t length; + amsarray_size_t reserved; + double growfactor; + T *data; //Rule of 5 boilerplate @@ -37,8 +40,17 @@ namespace ams // amsarray_failure. int resize(amsarray_size_t _newlen); + //resizing routine for insertions/erasures, + //adjusts reserved capacity according to the growth factor + int resize_insert(amsarray_size_t _newlen); + + int reserve(amsarray_size_t _newcap); + + int shrink_to_fit(); + //returns the array length for routines that expect size() to be present - const amsarray_size_t size() const; + const amsarray_size_t size() const; //returns length + const amsarray_size_t capacity() const; //returns reserved T& operator[](amsarray_size_t ind); const T& operator[](amsarray_size_t ind) const; diff --git a/include/amsmathutil25/util/amsmathutil25_amsarray_impl.hpp b/include/amsmathutil25/util/amsmathutil25_amsarray_impl.hpp index 8fd6ab2..8cb3948 100644 --- a/include/amsmathutil25/util/amsmathutil25_amsarray_impl.hpp +++ b/include/amsmathutil25/util/amsmathutil25_amsarray_impl.hpp @@ -7,6 +7,8 @@ namespace ams template amsarray::amsarray() { length = 0; + reserved = 0; + growfactor = 1.5; data = NULL; return; } @@ -14,6 +16,8 @@ namespace ams template amsarray::~amsarray() { length = 0; + reserved = 0; + growfactor = 1.5; if(data!=NULL) {delete[] data; data = NULL;} return; } @@ -23,22 +27,28 @@ namespace ams return this->length; } - template int amsarray::resize(amsarray_size_t _newlen) + template const amsarray_size_t amsarray::capacity() const + { + return this->reserved; + } + + template int amsarray::reserve(amsarray_size_t _newcap) { int ret = amsarray_success; T *newdata = NULL; amsarray_size_t lmin; T defval = T(); - if(_newlen<=0) + if(_newcap<=0) { length = 0; + reserved = 0; if(data!=NULL) {delete[] data; data = NULL;} ret = amsarray_success; return ret; } - newdata = new(std::nothrow) T[_newlen]; + newdata = new(std::nothrow) T[_newcap]; if(newdata==NULL) { ret = amsarray_failure; @@ -47,15 +57,114 @@ namespace ams if(data!=NULL) { - lmin = (_newlen>=length) ? length : _newlen; + lmin = (_newcap>=reserved) ? length : _newcap; ams::buffer_cast_copy(newdata,data,lmin); } - ams::buffer_set(newdata,length,_newlen,defval); + ams::buffer_set(newdata,reserved,_newcap,defval); if(data!=NULL) {delete[] data; data = NULL;} data = newdata; + reserved = _newcap; + length = (length int amsarray::resize(amsarray_size_t _newlen) + { + int ret = amsarray_success; + int res; + + _newlen = (_newlen<0)? 0:_newlen; + + res = this->reserve(_newlen); + if(res!=amsarray_success) + { + ret = amsarray_failure; + return ret; + } + + length = _newlen; + ret = amsarray_success; + return ret; + } + + //resizing routine for insertions/erasures, + //adjusts reserved capacity according to the growth factor + template int amsarray::resize_insert(amsarray_size_t _newlen) + { + int ret = amsarray_success; + int res; + amsarray_size_t q; + + if(_newlen<=0) + { + res = this->reserve(0); + if(res!=amsarray_success) + { + ret = amsarray_failure; + return ret; + } + length = 0; + return ret; + } + + if(growfactor>1.0) + { + + if(_newlen>reserved) + { + q = (amsarray_size_t)(growfactor*(double)_newlen); + q = (q<_newlen) ? _newlen : q; + res = this->reserve(q); + if(res!=amsarray_success) + { + ret = amsarray_failure; + return ret; + } + length = _newlen; + return ret; + } + + q = (amsarray_size_t)((1.0/growfactor)*(double)_newlen); + if(_newlenreserve(_newlen); + if(res!=amsarray_success) + { + ret = amsarray_failure; + return ret; + } + length = _newlen; + return ret; + } + + //else do nothing + length = _newlen; + return ret; + } + else + { + //ignore growfactor + res = this->reserve(_newlen); + if(res!=amsarray_success) + { + ret = amsarray_failure; + return ret; + } + length = _newlen; + return ret; + } + + //technically you shouldn't ever reach here length = _newlen; + return ret; + } + template int amsarray::shrink_to_fit() + { + int ret; + ret = this->reserve(this->length); return ret; } @@ -63,6 +172,8 @@ namespace ams { int res = amsarray_success; length = 0; + reserved = 0; + growfactor = 1.5; data = NULL; if(this!=&other) { @@ -78,6 +189,8 @@ namespace ams template amsarray::amsarray(amsarray&& other) noexcept { length = 0; + reserved = 0; + growfactor = 1.5; data = NULL; if(this!=&other) { @@ -110,6 +223,8 @@ namespace ams { if(data!=NULL) {delete[] data; data = NULL;} length = other.length; + reserved = other.reserved; + growfactor = other.growfactor; data = other.data; other.length = 0; other.data = NULL; @@ -143,6 +258,8 @@ namespace ams amsarray_size_t I; int res; length = 0; + reserved = 0; + growfactor = 1.5; data = NULL; res = this->resize(initlist.size()); @@ -288,7 +405,7 @@ template int amsarray::insert(amsarray_size_t ind, const T& val) } else if(ind<=this->length) { - res = narr.resize(this->length+1); + res = narr.resize_insert(this->length+1); if(res!=amsarray_success) { ret = amsarray_failure; @@ -321,7 +438,7 @@ template int amsarray::insert(amsarray_size_t ind, const T& val) else { //inserting past the end of the array - res = narr.resize(ind+1); + res = narr.resize_insert(ind+1); if(res!=amsarray_success) { ret = amsarray_failure; @@ -362,7 +479,7 @@ template int amsarray::erase(amsarray_size_t ind) return ret; } - res = narr.resize(this->length-1); + res = narr.resize_insert(this->length-1); if(res!=amsarray_success) { ret = amsarray_failure; @@ -735,11 +852,20 @@ template amsarray amsarray::reverse() return ret; } +// If I implement this generic method, then things fail to find the +// template specialized methods template void amsarray::print(bool newline, int printstyle) { //empty method - specialize for each type + + return; } +//adding these declarations also seems to fix it. +template<> void amsarray::print(bool newline, int printstyle); +template<> void amsarray::print(bool newline, int printstyle); +template<> void amsarray::print(bool newline, int printstyle); +template<> void amsarray::print(bool newline, int printstyle); }; //end namespace ams diff --git a/src/amsmathutil25/testing/amsmathtuil25_test1.cpp b/src/amsmathutil25/testing/amsmathtuil25_test1.cpp index 48ebb25..9e91e5c 100644 --- a/src/amsmathutil25/testing/amsmathtuil25_test1.cpp +++ b/src/amsmathutil25/testing/amsmathtuil25_test1.cpp @@ -189,6 +189,63 @@ void test_amsarray_sort1() } +void test_amsarray_insertdelete1() +{ + amsarray q; + int I,J,K; + + q.insert(0,1); + q.print(); printf("\n"); + q.insert(0,2); + q.print(); printf("\n"); + q.insert(0,3); + q.print(); printf("\n"); + q.insert(-1,1); + q.print(); printf("\n"); + q.insert(10,99); + q.print(); printf("\n"); + + I = 3; + printf("q.find(%d)=%d\n",I,(int)q.find(I)); + I = 1; + printf("q.find(%d)=%d\n",I,(int)q.find(I)); + I = 5; + printf("q.find(%d)=%d\n",I,(int)q.find(I)); + I = 99; + printf("q.find(%d)=%d\n",I,(int)q.find(I)); + + I = 1; + printf("q.findinsert(%d)=%d\n",I,(int)q.find_insert_ordered(I)); + I = -1; + printf("q.findinsert(%d)=%d\n",I,(int)q.find_insert_ordered(I)); + I = 5; + printf("q.findinsert(%d)=%d\n",I,(int)q.find_insert_ordered(I)); + I = 99; + printf("q.findinsert(%d)=%d\n",I,(int)q.find_insert_ordered(I)); + I = 100; + printf("q.findinsert(%d)=%d\n",I,(int)q.find_insert_ordered(I)); + + q.erase(0); + q.print(); printf("\n"); + q.erase(-1); + q.print(); printf("\n"); + q.erase(q.length); + q.print(); printf("\n"); + q.erase(q.length-1); + q.print(); printf("\n"); + + q.resize(0); + for(I=0;I<25;I++) + { + J = ams::rand::randint(5,25); + K = q.find_insert_ordered(J); + q.insert(K,J); + q.print(); printf("\n"); + } + + return; +} + diff --git a/src/main.cpp b/src/main.cpp index a774b1d..d1c83e8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,7 +8,8 @@ int main(int argc, char* argv[]) //ams::amsmathutil25::test_amsarray1(); //ams::amsmathutil25::test_amsarray2(); //ams::amsmathutil25::test_amsarray_select(); - ams::amsmathutil25::test_amsarray_sort1(); + //ams::amsmathutil25::test_amsarray_sort1(); + ams::amsmathutil25::test_amsarray_insertdelete1(); return ret; } \ No newline at end of file