diff options
-rw-r--r-- | raul/Array.hpp | 50 | ||||
-rw-r--r-- | test/array_test.cpp | 71 | ||||
-rw-r--r-- | test/build_test.cpp | 41 | ||||
-rw-r--r-- | test/maid_test.cpp | 39 | ||||
-rw-r--r-- | wscript | 3 |
5 files changed, 187 insertions, 17 deletions
diff --git a/raul/Array.hpp b/raul/Array.hpp index 5dab626..ddbad3f 100644 --- a/raul/Array.hpp +++ b/raul/Array.hpp @@ -25,11 +25,8 @@ namespace Raul { -/** An array. +/** A disposable array with size. * - * Has a stack-like push_back(), but is NOT a resizeable array (the size given - * to the constructor or alloc method is the maximum number of elements which - * can be pushed). * \ingroup raul */ template <class T> @@ -40,8 +37,9 @@ public: : _size(size) , _elems(NULL) { - if (size > 0) + if (size > 0) { _elems = new T[size]; + } } Array(size_t size, T initial_value) @@ -50,8 +48,18 @@ public: { if (size > 0) { _elems = new T[size]; - for (size_t i = 0; i < size; ++i) + for (size_t i = 0; i < size; ++i) { _elems[i] = initial_value; + } + } + } + + explicit Array(const Array<T>& copy) + : _size(copy._size) + { + _elems = new T[_size]; + for (size_t i = 0; i < _size; ++i) { + _elems[i] = copy._elems[i]; } } @@ -60,8 +68,9 @@ public: { assert(contents.size() >= size); _elems = new T[size]; - for (size_t i = 0; i < std::min(size, contents.size()); ++i) + for (size_t i = 0; i < std::min(size, contents.size()); ++i) { _elems[i] = contents[i]; + } } Array(size_t size, const Array<T>& contents, T initial_value = T()) @@ -69,10 +78,12 @@ public: { _elems = new T[size]; const size_t end = std::min(size, contents.size()); - for (size_t i = 0; i < end; ++i) + for (size_t i = 0; i < end; ++i) { _elems[i] = contents[i]; - for (size_t i = end; i < size; ++i) + } + for (size_t i = end; i < size; ++i) { _elems[i] = initial_value; + } } ~Array() { @@ -80,23 +91,28 @@ public: } virtual void alloc(size_t num_elems) { - assert(num_elems > 0); - delete[] _elems; _size = num_elems; - _elems = new T[num_elems]; + if (num_elems > 0) { + _elems = new T[num_elems]; + } else { + _elems = NULL; + } } virtual void alloc(size_t num_elems, T initial_value) { - assert(num_elems > 0); - delete[] _elems; _size = num_elems; - _elems = new T[num_elems]; - for (size_t i = 0; i < _size; ++i) - _elems[i] = initial_value; + if (num_elems > 0) { + _elems = new T[num_elems]; + for (size_t i = 0; i < _size; ++i) { + _elems[i] = initial_value; + } + } else { + _elems = NULL; + } } inline size_t size() const { return _size; } diff --git a/test/array_test.cpp b/test/array_test.cpp new file mode 100644 index 0000000..559e834 --- /dev/null +++ b/test/array_test.cpp @@ -0,0 +1,71 @@ +/* + This file is part of Raul. + Copyright 2007-2013 David Robillard <http://drobilla.net> + + Raul is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or any later version. + + Raul is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Raul. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <stdio.h> + +#include "raul/Array.hpp" + +int +main(int argc, char** argv) +{ + Raul::Array<int> array1(32); + + array1[0] = 42; + if (array1[0] != 42) { + fprintf(stderr, "array1[0] != 42\n"); + return 1; + } else if (array1.size() != 32) { + fprintf(stderr, "array1.size() != 1\n"); + return 1; + } + + array1.alloc(16, 0); + if (array1[0] != 0) { + fprintf(stderr, "array1[0] != 0\n"); + return 1; + } else if (array1.at(0) != 0) { + fprintf(stderr, "array1.at(0) != 0\n"); + return 1; + } else if (array1.size() != 16) { + fprintf(stderr, "array1.size() != 16\n"); + return 1; + } + + array1.alloc(8); + if (array1.size() != 8) { + fprintf(stderr, "array1.size() != 8\n"); + return 1; + } + + Raul::Array<int> array2(array1); + for (size_t i = 0; i < array1.size(); ++i) { + if (array2[i] != array1[i]) { + fprintf(stderr, "Mismatch at %zu\n", i); + return 1; + } + } + + Raul::Array<int> array3(8, 47); + if (array3[0] != 47) { + fprintf(stderr, "array3[0] != 47\n"); + return 1; + } else if (array3.size() != 8) { + fprintf(stderr, "array3.size() != 8\n"); + return 1; + } + + return 0; +} diff --git a/test/build_test.cpp b/test/build_test.cpp new file mode 100644 index 0000000..f645588 --- /dev/null +++ b/test/build_test.cpp @@ -0,0 +1,41 @@ +/* + This file is part of Raul. + Copyright 2007-2013 David Robillard <http://drobilla.net> + + Raul is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or any later version. + + Raul is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Raul. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "raul/Array.hpp" +#include "raul/barrier.hpp" +#include "raul/Deletable.hpp" +#include "raul/DoubleBuffer.hpp" +#include "raul/Exception.hpp" +#include "raul/Maid.hpp" +#include "raul/Noncopyable.hpp" +#include "raul/Path.hpp" +#include "raul/Process.hpp" +#include "raul/RingBuffer.hpp" +#include "raul/Semaphore.hpp" +#include "raul/Socket.hpp" +#include "raul/SRMWQueue.hpp" +#include "raul/SRSWQueue.hpp" +#include "raul/Symbol.hpp" +#include "raul/ThreadVar.hpp" +#include "raul/TimeSlice.hpp" +#include "raul/TimeStamp.hpp" +#include "raul/URI.hpp" + +int +main(int argc, char** argv) +{ + return 0; +} diff --git a/test/maid_test.cpp b/test/maid_test.cpp new file mode 100644 index 0000000..13d29e9 --- /dev/null +++ b/test/maid_test.cpp @@ -0,0 +1,39 @@ +/* + This file is part of Raul. + Copyright 2007-2013 David Robillard <http://drobilla.net> + + Raul is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or any later version. + + Raul is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Raul. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "raul/Maid.hpp" + +class DisposableThing : public Raul::Maid::Disposable +{}; + +class ManageableThing : public Raul::Maid::Manageable +{}; + +int +main(int argc, char** argv) +{ + Raul::Maid maid; + + DisposableThing* dis = new DisposableThing(); + + std::shared_ptr<ManageableThing> man(new ManageableThing()); + + maid.manage(man); + maid.dispose(dis); + maid.cleanup(); + + return 0; +} @@ -71,7 +71,10 @@ def configure(conf): print('') tests = ''' + test/array_test + test/build_test test/double_buffer_test + test/maid_test test/path_test test/queue_test test/ringbuffer_test |