You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by ap...@apache.org on 2020/04/20 09:11:08 UTC

[arrow] branch master updated: ARROW-8515: [C++] Bitmap::ToString should group by bytes

This is an automated email from the ASF dual-hosted git repository.

apitrou pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/master by this push:
     new 21ce3c5  ARROW-8515: [C++] Bitmap::ToString should group by bytes
21ce3c5 is described below

commit 21ce3c521fe8cc0ac526afe26d476c2799a96f20
Author: Micah Kornfield <em...@gmail.com>
AuthorDate: Mon Apr 20 11:10:36 2020 +0200

    ARROW-8515: [C++] Bitmap::ToString should group by bytes
    
    Closes #6987 from emkornfield/grouped_binary
    
    Authored-by: Micah Kornfield <em...@gmail.com>
    Signed-off-by: Antoine Pitrou <an...@python.org>
---
 cpp/src/arrow/util/bit_util.cc      |  4 ++--
 cpp/src/arrow/util/bit_util_test.cc | 11 +++++++++++
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/cpp/src/arrow/util/bit_util.cc b/cpp/src/arrow/util/bit_util.cc
index 15bc561..319af78 100644
--- a/cpp/src/arrow/util/bit_util.cc
+++ b/cpp/src/arrow/util/bit_util.cc
@@ -323,9 +323,9 @@ Result<std::shared_ptr<Buffer>> BitmapOp(MemoryPool* pool, const uint8_t* left,
 }  // namespace
 
 std::string Bitmap::ToString() const {
-  std::string out(length_, '0');
+  std::string out(length_ + ((length_ - 1) / 8), ' ');
   for (int64_t i = 0; i < length_; ++i) {
-    out[i] = GetBit(i) ? '1' : '0';
+    out[i + (i / 8)] = GetBit(i) ? '1' : '0';
   }
   return out;
 }
diff --git a/cpp/src/arrow/util/bit_util_test.cc b/cpp/src/arrow/util/bit_util_test.cc
index a8e6279..40f2a33 100644
--- a/cpp/src/arrow/util/bit_util_test.cc
+++ b/cpp/src/arrow/util/bit_util_test.cc
@@ -1240,6 +1240,17 @@ TEST(Bitmap, VisitPartialWords) {
 
 #endif  // ARROW_VALGRIND
 
+TEST(Bitmap, ToString) {
+  uint64_t bitmap_value = 0xCAAC;
+  uint8_t* bitmap = reinterpret_cast<uint8_t*>(&bitmap_value);
+  EXPECT_EQ(Bitmap(bitmap, /*bit_offset*/ 0, /*length=*/34).ToString(),
+            "00110101 01010011 00000000 00000000 00");
+  EXPECT_EQ(Bitmap(bitmap, /*bit_offset*/ 0, /*length=*/16).ToString(),
+            "00110101 01010011");
+  EXPECT_EQ(Bitmap(bitmap, /*bit_offset*/ 0, /*length=*/11).ToString(), "00110101 010");
+  EXPECT_EQ(Bitmap(bitmap, /*bit_offset*/ 3, /*length=*/8).ToString(), "10101010");
+}
+
 // compute bitwise AND of bitmaps using word-wise visit
 TEST(Bitmap, VisitWordsAnd) {
   constexpr int64_t nbytes = 1 << 10;