3838#include " arrow/array/builder_binary.h"
3939#include " arrow/array/builder_decimal.h"
4040#include " arrow/array/builder_dict.h"
41+ #include " arrow/array/builder_primitive.h"
4142#include " arrow/array/builder_run_end.h"
4243#include " arrow/array/builder_time.h"
4344#include " arrow/array/data.h"
6061#include " arrow/util/bitmap_builders.h"
6162#include " arrow/util/checked_cast.h"
6263#include " arrow/util/decimal.h"
64+ #include " arrow/util/float16.h"
6365#include " arrow/util/key_value_metadata.h"
6466#include " arrow/util/macros.h"
6567#include " arrow/util/range.h"
@@ -72,6 +74,7 @@ namespace arrow {
7274
7375using internal::checked_cast;
7476using internal::checked_pointer_cast;
77+ using util::Float16;
7578
7679class TestArray : public ::testing::Test {
7780 public:
@@ -4099,4 +4102,73 @@ TYPED_TEST(TestPrimitiveArray, IndexOperator) {
40994102 }
41004103}
41014104
4105+ class TestHalfFloatBuilder : public ::testing::Test {
4106+ public:
4107+ void VerifyValue (const HalfFloatBuilder& builder, int64_t index, float expected) {
4108+ ASSERT_EQ (builder.GetValue (index), Float16 (expected).bits ());
4109+ ASSERT_EQ (builder.GetValue <Float16>(index), Float16 (expected));
4110+ ASSERT_EQ (builder.GetValue <uint16_t >(index), Float16 (expected).bits ());
4111+ ASSERT_EQ (builder[index], Float16 (expected).bits ());
4112+ }
4113+ };
4114+
4115+ TEST_F (TestHalfFloatBuilder, TestAppend) {
4116+ HalfFloatBuilder builder;
4117+ ASSERT_OK (builder.Append (Float16 (0 .0f )));
4118+ ASSERT_OK (builder.Append (Float16 (1 .0f ).bits ()));
4119+ ASSERT_OK (builder.AppendNull ());
4120+ ASSERT_OK (builder.Reserve (3 ));
4121+ builder.UnsafeAppend (Float16 (3 .0f ));
4122+ builder.UnsafeAppend (Float16 (4 .0f ).bits ());
4123+ builder.UnsafeAppend (uint16_t {15872 }); // 1.5f
4124+
4125+ VerifyValue (builder, 0 , 0 .0f );
4126+ VerifyValue (builder, 1 , 1 .0f );
4127+ VerifyValue (builder, 3 , 3 .0f );
4128+ VerifyValue (builder, 4 , 4 .0f );
4129+ VerifyValue (builder, 5 , 1 .5f );
4130+ }
4131+
4132+ TEST_F (TestHalfFloatBuilder, TestBulkAppend) {
4133+ HalfFloatBuilder builder;
4134+
4135+ ASSERT_OK (builder.AppendValues (5 , Float16 (1.5 )));
4136+ uint16_t val = Float16 (2 .0f ).bits ();
4137+ ASSERT_OK (builder.AppendValues ({val, val, val, val}, {0 , 1 , 0 , 1 }));
4138+ ASSERT_EQ (builder.length (), 9 );
4139+ for (int i = 0 ; i < 5 ; i++) {
4140+ VerifyValue (builder, i, 1 .5f );
4141+ }
4142+
4143+ {
4144+ ASSERT_OK_AND_ASSIGN (auto array, builder.Finish ());
4145+ ASSERT_OK (array->ValidateFull ());
4146+ ASSERT_EQ (array->null_count (), 2 );
4147+ ASSERT_EQ (array->length (), 9 );
4148+ auto comp = ArrayFromJSON (float16 (), " [1.5,1.5,1.5,1.5,1.5,null,2,null,2]" );
4149+ AssertArraysEqual (*array, *comp);
4150+ }
4151+
4152+ std::vector<Float16> vals = {Float16 (1 .0f ), Float16 (2 .0f ), Float16 (3 .0f )};
4153+ std::vector<bool > is_valid = {true , false , true };
4154+ std::vector<uint8_t > valid_bytes = {1 , 0 , 1 };
4155+ std::vector<uint8_t > bitmap = {0b00000101 };
4156+ ASSERT_OK (builder.AppendValues (vals));
4157+ ASSERT_OK (builder.AppendValues (vals, is_valid));
4158+ ASSERT_OK (builder.AppendValues (vals.data (), vals.size (), is_valid));
4159+ ASSERT_OK (builder.AppendValues (vals.data (), vals.size ()));
4160+ ASSERT_OK (builder.AppendValues (vals.data (), vals.size (), valid_bytes.data ()));
4161+ ASSERT_OK (builder.AppendValues (vals.data (), vals.size (), bitmap.data (), 0 ));
4162+
4163+ {
4164+ ASSERT_OK_AND_ASSIGN (auto array, builder.Finish ());
4165+ ASSERT_OK (array->ValidateFull ());
4166+ ASSERT_EQ (array->null_count (), 4 );
4167+ ASSERT_EQ (array->length (), 18 );
4168+ auto comp =
4169+ ArrayFromJSON (float16 (), " [1,2,3,1,null,3,1,null,3,1,2,3,1,null,3,1,null,3]" );
4170+ AssertArraysEqual (*array, *comp);
4171+ }
4172+ }
4173+
41024174} // namespace arrow
0 commit comments