You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by uw...@apache.org on 2017/04/25 06:45:07 UTC

arrow git commit: ARROW-890: [GLib] Add GArrowMutableBuffer

Repository: arrow
Updated Branches:
  refs/heads/master eaf2118ef -> f00e2ab59


ARROW-890: [GLib] Add GArrowMutableBuffer

Author: Kouhei Sutou <ko...@clear-code.com>

Closes #596 from kou/glib-mutable-buffer and squashes the following commits:

73c2663 [Kouhei Sutou] [GLib] Support running tests on Ubuntu 14.04
d211a22 [Kouhei Sutou] [GLib] Add GArrowMutableBuffer


Project: http://git-wip-us.apache.org/repos/asf/arrow/repo
Commit: http://git-wip-us.apache.org/repos/asf/arrow/commit/f00e2ab5
Tree: http://git-wip-us.apache.org/repos/asf/arrow/tree/f00e2ab5
Diff: http://git-wip-us.apache.org/repos/asf/arrow/diff/f00e2ab5

Branch: refs/heads/master
Commit: f00e2ab590ad8f04409e7bc09f70622e73ebd741
Parents: eaf2118
Author: Kouhei Sutou <ko...@clear-code.com>
Authored: Tue Apr 25 08:45:01 2017 +0200
Committer: Uwe L. Korn <uw...@xhochy.com>
Committed: Tue Apr 25 08:45:01 2017 +0200

----------------------------------------------------------------------
 c_glib/arrow-glib/buffer.cpp       | 97 ++++++++++++++++++++++++++++++++-
 c_glib/arrow-glib/buffer.h         | 52 ++++++++++++++++++
 c_glib/arrow-glib/buffer.hpp       |  2 +
 c_glib/test/test-buffer.rb         |  7 +++
 c_glib/test/test-mutable-buffer.rb | 38 +++++++++++++
 5 files changed, 195 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/arrow/blob/f00e2ab5/c_glib/arrow-glib/buffer.cpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/buffer.cpp b/c_glib/arrow-glib/buffer.cpp
index 9853e89..5fc3b07 100644
--- a/c_glib/arrow-glib/buffer.cpp
+++ b/c_glib/arrow-glib/buffer.cpp
@@ -28,10 +28,16 @@ G_BEGIN_DECLS
 
 /**
  * SECTION: buffer
- * @short_description: Buffer class
+ * @section_id: buffer-classes
+ * @title: Buffer classes
+ * @include: arrow-glib/arrow-glib.h
  *
  * #GArrowBuffer is a class for keeping data. Other classes such as
  * #GArrowArray and #GArrowTensor can use data in buffer.
+ *
+ * #GArrowBuffer is immutable.
+ *
+ * #GArrowMutableBuffer is mutable.
  */
 
 typedef struct GArrowBufferPrivate_ {
@@ -183,6 +189,27 @@ garrow_buffer_get_data(GArrowBuffer *buffer)
 }
 
 /**
+ * garrow_buffer_get_mutable_data:
+ * @buffer: A #GArrowBuffer.
+ *
+ * Returns: (transfer full) (nullable): The data of the buffer. If the
+ *   buffer is imutable, it returns %NULL. The data is owned by the
+ *   buffer. You should not free the data.
+ *
+ * Since: 0.3.0
+ */
+GBytes *
+garrow_buffer_get_mutable_data(GArrowBuffer *buffer)
+{
+  auto arrow_buffer = garrow_buffer_get_raw(buffer);
+  if (!arrow_buffer->is_mutable()) {
+    return NULL;
+  }
+  return g_bytes_new_static(arrow_buffer->mutable_data(),
+                            arrow_buffer->size());
+}
+
+/**
  * garrow_buffer_get_size:
  * @buffer: A #GArrowBuffer.
  *
@@ -271,6 +298,65 @@ garrow_buffer_slice(GArrowBuffer *buffer, gint64 offset, gint64 size)
   return garrow_buffer_new_raw(&arrow_buffer);
 }
 
+
+G_DEFINE_TYPE(GArrowMutableBuffer,              \
+              garrow_mutable_buffer,            \
+              GARROW_TYPE_BUFFER)
+
+static void
+garrow_mutable_buffer_init(GArrowMutableBuffer *object)
+{
+}
+
+static void
+garrow_mutable_buffer_class_init(GArrowMutableBufferClass *klass)
+{
+}
+
+/**
+ * garrow_mutable_buffer_new:
+ * @data: (array length=size): Data for the buffer.
+ *   They aren't owned by the new buffer.
+ *   You must not free the data while the new buffer is alive.
+ * @size: The number of bytes of the data.
+ *
+ * Returns: A newly created #GArrowMutableBuffer.
+ *
+ * Since: 0.3.0
+ */
+GArrowMutableBuffer *
+garrow_mutable_buffer_new(guint8 *data, gint64 size)
+{
+  auto arrow_buffer = std::make_shared<arrow::MutableBuffer>(data, size);
+  return garrow_mutable_buffer_new_raw(&arrow_buffer);
+}
+
+/**
+ * garrow_mutable_buffer_slice:
+ * @buffer: A #GArrowMutableBuffer.
+ * @offset: An offset in the buffer data in byte.
+ * @size: The number of bytes of the sliced data.
+ *
+ * Returns: (transfer full): A newly created #GArrowMutableBuffer that
+ *   shares data of the base #GArrowMutableBuffer. The created
+ *   #GArrowMutableBuffer has data start with offset from the base
+ *   buffer data and are the specified bytes size.
+ *
+ * Since: 0.3.0
+ */
+GArrowMutableBuffer *
+garrow_mutable_buffer_slice(GArrowMutableBuffer *buffer,
+                            gint64 offset,
+                            gint64 size)
+{
+  auto arrow_parent_buffer = garrow_buffer_get_raw(GARROW_BUFFER(buffer));
+  auto arrow_buffer =
+    std::make_shared<arrow::MutableBuffer>(arrow_parent_buffer,
+                                           offset,
+                                           size);
+  return garrow_mutable_buffer_new_raw(&arrow_buffer);
+}
+
 G_END_DECLS
 
 GArrowBuffer *
@@ -288,3 +374,12 @@ garrow_buffer_get_raw(GArrowBuffer *buffer)
   auto priv = GARROW_BUFFER_GET_PRIVATE(buffer);
   return priv->buffer;
 }
+
+GArrowMutableBuffer *
+garrow_mutable_buffer_new_raw(std::shared_ptr<arrow::MutableBuffer> *arrow_buffer)
+{
+  auto buffer = GARROW_MUTABLE_BUFFER(g_object_new(GARROW_TYPE_MUTABLE_BUFFER,
+                                                   "buffer", arrow_buffer,
+                                                   NULL));
+  return buffer;
+}

http://git-wip-us.apache.org/repos/asf/arrow/blob/f00e2ab5/c_glib/arrow-glib/buffer.h
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/buffer.h b/c_glib/arrow-glib/buffer.h
index 83e1d0d..5334614 100644
--- a/c_glib/arrow-glib/buffer.h
+++ b/c_glib/arrow-glib/buffer.h
@@ -62,6 +62,7 @@ GArrowBuffer  *garrow_buffer_new          (const guint8 *data,
 gboolean       garrow_buffer_is_mutable   (GArrowBuffer *buffer);
 gint64         garrow_buffer_get_capacity (GArrowBuffer *buffer);
 GBytes        *garrow_buffer_get_data     (GArrowBuffer *buffer);
+GBytes        *garrow_buffer_get_mutable_data(GArrowBuffer *buffer);
 gint64         garrow_buffer_get_size     (GArrowBuffer *buffer);
 GArrowBuffer  *garrow_buffer_get_parent   (GArrowBuffer *buffer);
 
@@ -73,4 +74,55 @@ GArrowBuffer  *garrow_buffer_slice        (GArrowBuffer *buffer,
                                            gint64 offset,
                                            gint64 size);
 
+
+#define GARROW_TYPE_MUTABLE_BUFFER              \
+  (garrow_mutable_buffer_get_type())
+#define GARROW_MUTABLE_BUFFER(obj)                              \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
+                              GARROW_TYPE_MUTABLE_BUFFER,       \
+                              GArrowMutableBuffer))
+#define GARROW_MUTABLE_BUFFER_CLASS(klass)              \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_MUTABLE_BUFFER,  \
+                           GArrowMutableBufferClass))
+#define GARROW_IS_MUTABLE_BUFFER(obj)                                   \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj), GARROW_TYPE_MUTABLE_BUFFER))
+#define GARROW_IS_MUTABLE_BUFFER_CLASS(klass)                           \
+  (G_TYPE_CHECK_CLASS_TYPE((klass), GARROW_TYPE_MUTABLE_BUFFER))
+#define GARROW_MUTABLE_BUFFER_GET_CLASS(obj)                    \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
+                             GARROW_TYPE_MUTABLE_BUFFER,        \
+                             GArrowMutableBufferClass))
+
+typedef struct _GArrowMutableBuffer         GArrowMutableBuffer;
+#ifndef __GTK_DOC_IGNORE__
+typedef struct _GArrowMutableBufferClass    GArrowMutableBufferClass;
+#endif
+
+/**
+ * GArrowMutableBuffer:
+ *
+ * It wraps `arrow::MutableBuffer`.
+ */
+struct _GArrowMutableBuffer
+{
+  /*< private >*/
+  GArrowBuffer parent_instance;
+};
+
+#ifndef __GTK_DOC_IGNORE__
+struct _GArrowMutableBufferClass
+{
+  GArrowBufferClass parent_class;
+};
+#endif
+
+GType garrow_mutable_buffer_get_type(void) G_GNUC_CONST;
+
+GArrowMutableBuffer *garrow_mutable_buffer_new  (guint8 *data,
+                                                 gint64 size);
+GArrowMutableBuffer *garrow_mutable_buffer_slice(GArrowMutableBuffer *buffer,
+                                                 gint64 offset,
+                                                 gint64 size);
+
 G_END_DECLS

http://git-wip-us.apache.org/repos/asf/arrow/blob/f00e2ab5/c_glib/arrow-glib/buffer.hpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/buffer.hpp b/c_glib/arrow-glib/buffer.hpp
index 00dd3de..1337d9e 100644
--- a/c_glib/arrow-glib/buffer.hpp
+++ b/c_glib/arrow-glib/buffer.hpp
@@ -25,3 +25,5 @@
 
 GArrowBuffer *garrow_buffer_new_raw(std::shared_ptr<arrow::Buffer> *arrow_buffer);
 std::shared_ptr<arrow::Buffer> garrow_buffer_get_raw(GArrowBuffer *buffer);
+
+GArrowMutableBuffer *garrow_mutable_buffer_new_raw(std::shared_ptr<arrow::MutableBuffer> *arrow_buffer);

http://git-wip-us.apache.org/repos/asf/arrow/blob/f00e2ab5/c_glib/test/test-buffer.rb
----------------------------------------------------------------------
diff --git a/c_glib/test/test-buffer.rb b/c_glib/test/test-buffer.rb
index 6bb9671..9f76a80 100644
--- a/c_glib/test/test-buffer.rb
+++ b/c_glib/test/test-buffer.rb
@@ -16,6 +16,8 @@
 # under the License.
 
 class TestBuffer < Test::Unit::TestCase
+  include Helper::Omittable
+
   def setup
     @data = "Hello"
     @buffer = Arrow::Buffer.new(@data)
@@ -35,6 +37,11 @@ class TestBuffer < Test::Unit::TestCase
     assert_equal(@data, @buffer.data.to_s)
   end
 
+  def test_mutable_data
+    require_gi(3, 1, 2)
+    assert_nil(@buffer.mutable_data)
+  end
+
   def test_size
     assert_equal(@data.bytesize, @buffer.size)
   end

http://git-wip-us.apache.org/repos/asf/arrow/blob/f00e2ab5/c_glib/test/test-mutable-buffer.rb
----------------------------------------------------------------------
diff --git a/c_glib/test/test-mutable-buffer.rb b/c_glib/test/test-mutable-buffer.rb
new file mode 100644
index 0000000..df62dcf
--- /dev/null
+++ b/c_glib/test/test-mutable-buffer.rb
@@ -0,0 +1,38 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+class TestMutableBuffer < Test::Unit::TestCase
+  def setup
+    @data = "Hello"
+    @buffer = Arrow::MutableBuffer.new(@data)
+  end
+
+  def test_mutable?
+    assert do
+      @buffer.mutable?
+    end
+  end
+
+  def test_mutable_data
+    assert_equal(@data, @buffer.mutable_data.to_s)
+  end
+
+  def test_slice
+    sliced_buffer = @buffer.slice(1, 3)
+    assert_equal(@data[1, 3], sliced_buffer.data.to_s)
+  end
+end