Repository: arrow Updated Branches: refs/heads/master 0cf2bbb2a -> 867f92470
ARROW-231 [C++]: Add typed Resize to PoolBuffer I also added a typed Reserve to be consistent. Let me know what you think. Author: Johan Mabille <[email protected]> Closes #391 from JohanMabille/buffer_resize and squashes the following commits: 90ccbfa [Johan Mabille] typed resize Project: http://git-wip-us.apache.org/repos/asf/arrow/repo Commit: http://git-wip-us.apache.org/repos/asf/arrow/commit/867f9247 Tree: http://git-wip-us.apache.org/repos/asf/arrow/tree/867f9247 Diff: http://git-wip-us.apache.org/repos/asf/arrow/diff/867f9247 Branch: refs/heads/master Commit: 867f92470597a41ccef44bc145c979f0d396387c Parents: 0cf2bbb Author: Johan Mabille <[email protected]> Authored: Thu Mar 16 18:23:16 2017 -0400 Committer: Wes McKinney <[email protected]> Committed: Thu Mar 16 18:23:16 2017 -0400 ---------------------------------------------------------------------- cpp/src/arrow/buffer-test.cc | 19 +++++++++++++++++++ cpp/src/arrow/buffer.h | 10 ++++++++++ 2 files changed, 29 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/arrow/blob/867f9247/cpp/src/arrow/buffer-test.cc ---------------------------------------------------------------------- diff --git a/cpp/src/arrow/buffer-test.cc b/cpp/src/arrow/buffer-test.cc index 934fcfe..e0a2137 100644 --- a/cpp/src/arrow/buffer-test.cc +++ b/cpp/src/arrow/buffer-test.cc @@ -66,6 +66,25 @@ TEST_F(TestBuffer, Resize) { ASSERT_EQ(128, buf.capacity()); } +TEST_F(TestBuffer, TypedResize) { + PoolBuffer buf; + + ASSERT_EQ(0, buf.size()); + ASSERT_OK(buf.TypedResize<double>(100)); + ASSERT_EQ(800, buf.size()); + ASSERT_OK(buf.TypedResize<double>(200)); + ASSERT_EQ(1600, buf.size()); + + ASSERT_OK(buf.TypedResize<double>(50, true)); + ASSERT_EQ(400, buf.size()); + ASSERT_EQ(448, buf.capacity()); + + ASSERT_OK(buf.TypedResize<double>(100)); + ASSERT_EQ(832, buf.capacity()); + ASSERT_OK(buf.TypedResize<double>(50, false)); + ASSERT_EQ(832, buf.capacity()); +} + TEST_F(TestBuffer, ResizeOOM) { // This test doesn't play nice with AddressSanitizer #ifndef ADDRESS_SANITIZER http://git-wip-us.apache.org/repos/asf/arrow/blob/867f9247/cpp/src/arrow/buffer.h ---------------------------------------------------------------------- diff --git a/cpp/src/arrow/buffer.h b/cpp/src/arrow/buffer.h index 26c8ea6..1647e86 100644 --- a/cpp/src/arrow/buffer.h +++ b/cpp/src/arrow/buffer.h @@ -133,6 +133,16 @@ class ARROW_EXPORT ResizableBuffer : public MutableBuffer { /// It does not change buffer's reported size. virtual Status Reserve(int64_t new_capacity) = 0; + template <class T> + Status TypedResize(int64_t new_nb_elements, bool shrink_to_fit = true) { + return Resize(sizeof(T) * new_nb_elements, shrink_to_fit); + } + + template <class T> + Status TypedReserve(int64_t new_nb_elements) { + return Reserve(sizeof(T) * new_nb_elements); + } + protected: ResizableBuffer(uint8_t* data, int64_t size) : MutableBuffer(data, size) {} };
