You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by we...@apache.org on 2017/04/12 16:23:27 UTC

arrow git commit: ARROW-811: [GLib] Add GArrowBuffer

Repository: arrow
Updated Branches:
  refs/heads/master 6443b8287 -> 9db96fea4


ARROW-811: [GLib] Add GArrowBuffer

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

Closes #531 from kou/glib-add-buffer and squashes the following commits:

1954c95 [Kouhei Sutou] [GLib] Add GArrowBuffer


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

Branch: refs/heads/master
Commit: 9db96fea4e5de59860a481da3036b3129eb97e3b
Parents: 6443b82
Author: Kouhei Sutou <ko...@clear-code.com>
Authored: Wed Apr 12 12:23:22 2017 -0400
Committer: Wes McKinney <we...@twosigma.com>
Committed: Wed Apr 12 12:23:22 2017 -0400

----------------------------------------------------------------------
 c_glib/arrow-glib/Makefile.am             |   7 +-
 c_glib/arrow-glib/buffer.cpp              | 289 +++++++++++++++++++++++++
 c_glib/arrow-glib/buffer.h                |  77 +++++++
 c_glib/arrow-glib/buffer.hpp              |  27 +++
 c_glib/doc/reference/arrow-glib-docs.sgml |   4 +
 c_glib/test/test-buffer.rb                |  55 +++++
 6 files changed, 457 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/arrow/blob/9db96fea/c_glib/arrow-glib/Makefile.am
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/Makefile.am b/c_glib/arrow-glib/Makefile.am
index 387707c..2e7a9a0 100644
--- a/c_glib/arrow-glib/Makefile.am
+++ b/c_glib/arrow-glib/Makefile.am
@@ -44,14 +44,15 @@ libarrow_glib_la_headers =			\
 	array.h					\
 	array-builder.h				\
 	arrow-glib.h				\
-	chunked-array.h				\
-	column.h				\
 	binary-array.h				\
 	binary-array-builder.h			\
 	binary-data-type.h			\
 	boolean-array.h				\
 	boolean-array-builder.h			\
 	boolean-data-type.h			\
+	buffer.h				\
+	chunked-array.h				\
+	column.h				\
 	data-type.h				\
 	double-array.h				\
 	double-array-builder.h			\
@@ -136,6 +137,7 @@ libarrow_glib_la_sources =			\
 	boolean-array.cpp			\
 	boolean-array-builder.cpp		\
 	boolean-data-type.cpp			\
+	buffer.cpp				\
 	chunked-array.cpp			\
 	column.cpp				\
 	data-type.cpp				\
@@ -212,6 +214,7 @@ libarrow_glib_la_cpp_headers =			\
 	array.hpp				\
 	array-builder.hpp			\
 	arrow-glib.hpp				\
+	buffer.hpp				\
 	chunked-array.hpp			\
 	column.hpp				\
 	data-type.hpp				\

http://git-wip-us.apache.org/repos/asf/arrow/blob/9db96fea/c_glib/arrow-glib/buffer.cpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/buffer.cpp b/c_glib/arrow-glib/buffer.cpp
new file mode 100644
index 0000000..0ec52df
--- /dev/null
+++ b/c_glib/arrow-glib/buffer.cpp
@@ -0,0 +1,289 @@
+/*
+ * 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <arrow-glib/buffer.hpp>
+#include <arrow-glib/error.hpp>
+
+G_BEGIN_DECLS
+
+/**
+ * SECTION: buffer
+ * @short_description: Buffer class
+ *
+ * #GArrowBuffer is a class for keeping data. Other classes such as
+ * #GArrowArray and #GArrowTensor can use data in buffer.
+ */
+
+typedef struct GArrowBufferPrivate_ {
+  std::shared_ptr<arrow::Buffer> buffer;
+} GArrowBufferPrivate;
+
+enum {
+  PROP_0,
+  PROP_BUFFER
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE(GArrowBuffer, garrow_buffer, G_TYPE_OBJECT)
+
+#define GARROW_BUFFER_GET_PRIVATE(obj) \
+  (G_TYPE_INSTANCE_GET_PRIVATE((obj), GARROW_TYPE_BUFFER, GArrowBufferPrivate))
+
+static void
+garrow_buffer_finalize(GObject *object)
+{
+  auto priv = GARROW_BUFFER_GET_PRIVATE(object);
+
+  priv->buffer = nullptr;
+
+  G_OBJECT_CLASS(garrow_buffer_parent_class)->finalize(object);
+}
+
+static void
+garrow_buffer_set_property(GObject *object,
+                          guint prop_id,
+                          const GValue *value,
+                          GParamSpec *pspec)
+{
+  auto priv = GARROW_BUFFER_GET_PRIVATE(object);
+
+  switch (prop_id) {
+  case PROP_BUFFER:
+    priv->buffer =
+      *static_cast<std::shared_ptr<arrow::Buffer> *>(g_value_get_pointer(value));
+    break;
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+    break;
+  }
+}
+
+static void
+garrow_buffer_get_property(GObject *object,
+                          guint prop_id,
+                          GValue *value,
+                          GParamSpec *pspec)
+{
+  switch (prop_id) {
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+    break;
+  }
+}
+
+static void
+garrow_buffer_init(GArrowBuffer *object)
+{
+}
+
+static void
+garrow_buffer_class_init(GArrowBufferClass *klass)
+{
+  GParamSpec *spec;
+
+  auto gobject_class = G_OBJECT_CLASS(klass);
+
+  gobject_class->finalize     = garrow_buffer_finalize;
+  gobject_class->set_property = garrow_buffer_set_property;
+  gobject_class->get_property = garrow_buffer_get_property;
+
+  spec = g_param_spec_pointer("buffer",
+                              "Buffer",
+                              "The raw std::shared<arrow::Buffer> *",
+                              static_cast<GParamFlags>(G_PARAM_WRITABLE |
+                                                       G_PARAM_CONSTRUCT_ONLY));
+  g_object_class_install_property(gobject_class, PROP_BUFFER, spec);
+}
+
+/**
+ * garrow_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 #GArrowBuffer.
+ *
+ * Since: 0.3.0
+ */
+GArrowBuffer *
+garrow_buffer_new(const guint8 *data, gint64 size)
+{
+  auto arrow_buffer = std::make_shared<arrow::Buffer>(data, size);
+  return garrow_buffer_new_raw(&arrow_buffer);
+
+}
+
+/**
+ * garrow_buffer_is_mutable:
+ * @buffer: A #GArrowBuffer.
+ *
+ * Returns: %TRUE if the buffer is mutable, %FALSE otherwise.
+ *
+ * Since: 0.3.0
+ */
+gboolean
+garrow_buffer_is_mutable(GArrowBuffer *buffer)
+{
+  auto arrow_buffer = garrow_buffer_get_raw(buffer);
+  return arrow_buffer->is_mutable();
+}
+
+/**
+ * garrow_buffer_get_capacity:
+ * @buffer: A #GArrowBuffer.
+ *
+ * Returns: The number of bytes that where allocated for the buffer in
+ *   total.
+ *
+ * Since: 0.3.0
+ */
+gint64
+garrow_buffer_get_capacity(GArrowBuffer *buffer)
+{
+  auto arrow_buffer = garrow_buffer_get_raw(buffer);
+  return arrow_buffer->capacity();
+}
+
+/**
+ * garrow_buffer_get_data:
+ * @buffer: A #GArrowBuffer.
+ * @size: (out): The number of bytes of the data.
+ *
+ * Returns: (array length=size): The data of the buffer.
+ *
+ * Since: 0.3.0
+ */
+const guint8 *
+garrow_buffer_get_data(GArrowBuffer *buffer, gint64 *size)
+{
+  auto arrow_buffer = garrow_buffer_get_raw(buffer);
+  *size = arrow_buffer->size();
+  return arrow_buffer->data();
+}
+
+/**
+ * garrow_buffer_get_size:
+ * @buffer: A #GArrowBuffer.
+ *
+ * Returns: The number of bytes that might have valid data.
+ *
+ * Since: 0.3.0
+ */
+gint64
+garrow_buffer_get_size(GArrowBuffer *buffer)
+{
+  auto arrow_buffer = garrow_buffer_get_raw(buffer);
+  return arrow_buffer->size();
+}
+
+/**
+ * garrow_buffer_get_parent:
+ * @buffer: A #GArrowBuffer.
+ *
+ * Returns: (nullable) (transfer full):
+ *   The parent #GArrowBuffer or %NULL.
+ *
+ * Since: 0.3.0
+ */
+GArrowBuffer *
+garrow_buffer_get_parent(GArrowBuffer *buffer)
+{
+  auto arrow_buffer = garrow_buffer_get_raw(buffer);
+  auto arrow_parent_buffer = arrow_buffer->parent();
+
+  if (arrow_parent_buffer) {
+    return garrow_buffer_new_raw(&arrow_parent_buffer);
+  } else {
+    return NULL;
+  }
+}
+
+/**
+ * garrow_buffer_copy:
+ * @buffer: A #GArrowBuffer.
+ * @start: An offset of data to be copied in byte.
+ * @size: The number of bytes to be copied from the start.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Returns: (nullable) (transfer full):
+ *   A newly copied #GArrowBuffer on success, %NULL on error.
+ *
+ * Since: 0.3.0
+ */
+GArrowBuffer *
+garrow_buffer_copy(GArrowBuffer *buffer,
+                   gint64 start,
+                   gint64 size,
+                   GError **error)
+{
+  auto arrow_buffer = garrow_buffer_get_raw(buffer);
+  std::shared_ptr<arrow::Buffer> arrow_copied_buffer;
+  auto status = arrow_buffer->Copy(start, size, &arrow_copied_buffer);
+  if (status.ok()) {
+    return garrow_buffer_new_raw(&arrow_copied_buffer);
+  } else {
+    garrow_error_set(error, status, "[buffer][copy]");
+    return NULL;
+  }
+}
+
+/**
+ * garrow_buffer_slice:
+ * @buffer: A #GArrowBuffer.
+ * @offset: An offset in the buffer data in byte.
+ * @size: The number of bytes of the sliced data.
+ *
+ * Returns: (transfer full): A newly created #GArrowBuffer that shares
+ *   data of the base #GArrowBuffer. The created #GArrowBuffer has data
+ *   start with offset from the base buffer data and are the specified
+ *   bytes size.
+ *
+ * Since: 0.3.0
+ */
+GArrowBuffer *
+garrow_buffer_slice(GArrowBuffer *buffer, gint64 offset, gint64 size)
+{
+  auto arrow_parent_buffer = garrow_buffer_get_raw(buffer);
+  auto arrow_buffer = std::make_shared<arrow::Buffer>(arrow_parent_buffer,
+                                                      offset,
+                                                      size);
+  return garrow_buffer_new_raw(&arrow_buffer);
+}
+
+G_END_DECLS
+
+GArrowBuffer *
+garrow_buffer_new_raw(std::shared_ptr<arrow::Buffer> *arrow_buffer)
+{
+  auto buffer = GARROW_BUFFER(g_object_new(GARROW_TYPE_BUFFER,
+                                           "buffer", arrow_buffer,
+                                           NULL));
+  return buffer;
+}
+
+std::shared_ptr<arrow::Buffer>
+garrow_buffer_get_raw(GArrowBuffer *buffer)
+{
+  auto priv = GARROW_BUFFER_GET_PRIVATE(buffer);
+  return priv->buffer;
+}

http://git-wip-us.apache.org/repos/asf/arrow/blob/9db96fea/c_glib/arrow-glib/buffer.h
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/buffer.h b/c_glib/arrow-glib/buffer.h
new file mode 100644
index 0000000..1e7d551
--- /dev/null
+++ b/c_glib/arrow-glib/buffer.h
@@ -0,0 +1,77 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GARROW_TYPE_BUFFER \
+  (garrow_buffer_get_type())
+#define GARROW_BUFFER(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj), GARROW_TYPE_BUFFER, GArrowBuffer))
+#define GARROW_BUFFER_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass), GARROW_TYPE_BUFFER, GArrowBufferClass))
+#define GARROW_IS_BUFFER(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj), GARROW_TYPE_BUFFER))
+#define GARROW_IS_BUFFER_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass), GARROW_TYPE_BUFFER))
+#define GARROW_BUFFER_GET_CLASS(obj) \
+  (G_TYPE_INSTANCE_GET_CLASS((obj), GARROW_TYPE_BUFFER, GArrowBufferClass))
+
+typedef struct _GArrowBuffer         GArrowBuffer;
+typedef struct _GArrowBufferClass    GArrowBufferClass;
+
+/**
+ * GArrowBuffer:
+ *
+ * It wraps `arrow::Buffer`.
+ */
+struct _GArrowBuffer
+{
+  /*< private >*/
+  GObject parent_instance;
+};
+
+struct _GArrowBufferClass
+{
+  GObjectClass parent_class;
+};
+
+GType          garrow_buffer_get_type     (void) G_GNUC_CONST;
+
+GArrowBuffer  *garrow_buffer_new          (const guint8 *data,
+                                           gint64 size);
+gboolean       garrow_buffer_is_mutable   (GArrowBuffer *buffer);
+gint64         garrow_buffer_get_capacity (GArrowBuffer *buffer);
+const guint8  *garrow_buffer_get_data     (GArrowBuffer *buffer,
+                                           gint64 *size);
+gint64         garrow_buffer_get_size     (GArrowBuffer *buffer);
+GArrowBuffer  *garrow_buffer_get_parent   (GArrowBuffer *buffer);
+
+GArrowBuffer  *garrow_buffer_copy         (GArrowBuffer *buffer,
+                                           gint64 start,
+                                           gint64 size,
+                                           GError **error);
+GArrowBuffer  *garrow_buffer_slice        (GArrowBuffer *buffer,
+                                           gint64 offset,
+                                           gint64 size);
+
+G_END_DECLS

http://git-wip-us.apache.org/repos/asf/arrow/blob/9db96fea/c_glib/arrow-glib/buffer.hpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/buffer.hpp b/c_glib/arrow-glib/buffer.hpp
new file mode 100644
index 0000000..00dd3de
--- /dev/null
+++ b/c_glib/arrow-glib/buffer.hpp
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include <arrow/api.h>
+
+#include <arrow-glib/buffer.h>
+
+GArrowBuffer *garrow_buffer_new_raw(std::shared_ptr<arrow::Buffer> *arrow_buffer);
+std::shared_ptr<arrow::Buffer> garrow_buffer_get_raw(GArrowBuffer *buffer);

http://git-wip-us.apache.org/repos/asf/arrow/blob/9db96fea/c_glib/doc/reference/arrow-glib-docs.sgml
----------------------------------------------------------------------
diff --git a/c_glib/doc/reference/arrow-glib-docs.sgml b/c_glib/doc/reference/arrow-glib-docs.sgml
index 396dce5..3c1d8d1 100644
--- a/c_glib/doc/reference/arrow-glib-docs.sgml
+++ b/c_glib/doc/reference/arrow-glib-docs.sgml
@@ -105,6 +105,10 @@
       <xi:include href="xml/column.xml"/>
       <xi:include href="xml/chunked-array.xml"/>
     </chapter>
+    <chapter id="buffer">
+      <title>Buffer</title>
+      <xi:include href="xml/buffer.xml"/>
+    </chapter>
     <chapter id="error">
       <title>Error</title>
       <xi:include href="xml/error.xml"/>

http://git-wip-us.apache.org/repos/asf/arrow/blob/9db96fea/c_glib/test/test-buffer.rb
----------------------------------------------------------------------
diff --git a/c_glib/test/test-buffer.rb b/c_glib/test/test-buffer.rb
new file mode 100644
index 0000000..1ea26f2
--- /dev/null
+++ b/c_glib/test/test-buffer.rb
@@ -0,0 +1,55 @@
+# 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 TestBuffer < Test::Unit::TestCase
+  def setup
+    @data = "Hello"
+    @buffer = Arrow::Buffer.new(@data)
+  end
+
+  def test_mutable?
+    assert do
+      not @buffer.mutable?
+    end
+  end
+
+  def test_capacity
+    assert_equal(@data.bytesize, @buffer.capacity)
+  end
+
+  def test_data
+    assert_equal(@data, @buffer.data.pack("C*"))
+  end
+
+  def test_size
+    assert_equal(@data.bytesize, @buffer.size)
+  end
+
+  def test_parent
+    assert_nil(@buffer.parent)
+  end
+
+  def test_copy
+    copied_buffer = @buffer.copy(1, 3)
+    assert_equal(@data[1, 3], copied_buffer.data.pack("C*"))
+  end
+
+  def test_slice
+    sliced_buffer = @buffer.slice(1, 3)
+    assert_equal(@data[1, 3], sliced_buffer.data.pack("C*"))
+  end
+end