sparrow
2.4.0
C++20 idiomatic APIs for the Apache Arrow Columnar Format
Toggle main menu visibility
Loading...
Searching...
No Matches
buffers.hpp
Go to the documentation of this file.
1
// Copyright 2024 Man Group Operations Limited
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
// http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or mplied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
15
#pragma once
16
17
#include <algorithm>
18
#include <numeric>
19
#include <ranges>
20
21
#include "
sparrow/buffer/buffer.hpp
"
22
#include "
sparrow/buffer/buffer_adaptor.hpp
"
23
#include "
sparrow/utils/ranges.hpp
"
24
25
namespace
sparrow
26
{
27
template
<std::ranges::range R>
28
requires
std::ranges::sized_range<std::ranges::range_value_t<R>>
29
[[nodiscard]]
size_t
number_of_bytes
(
const
R&
ranges
)
30
{
31
using
value_type = std::ranges::range_value_t<std::ranges::range_value_t<R>>;
32
return
std::transform_reduce(
33
ranges
.begin(),
34
ranges
.end(),
35
std::size_t{0},
36
std::plus<std::size_t>(),
37
[](
const
auto
& range)
38
{
39
return range.size() * sizeof(value_type);
40
}
41
);
42
}
43
44
template
<std::ranges::range R>
45
requires
(std::ranges::sized_range<std::ranges::range_value_t<R>>)
46
[[nodiscard]]
buffer<uint8_t>
strings_to_buffer
(R&& strings)
47
{
48
using
range_value_type = std::ranges::range_value_t<R>;
49
using
atomic_element_type = std::ranges::range_value_t<range_value_type>;
50
const
size_t
values_byte_count =
number_of_bytes
(strings);
51
buffer<uint8_t>
values_buffer(values_byte_count,
buffer<uint8_t>::default_allocator
());
52
if
(!strings.empty())
53
{
54
auto
buffer_adaptor
=
make_buffer_adaptor<atomic_element_type>
(values_buffer);
55
auto
iter =
buffer_adaptor
.
begin
();
56
for
(
auto
&&
string
: strings)
57
{
58
if
constexpr
(std::is_rvalue_reference_v<R>)
59
{
60
std::ranges::move(
string
, iter);
61
}
62
else
63
{
64
sparrow::ranges::copy
(
string
, iter);
65
}
66
std::advance(iter,
string
.size());
67
}
68
}
69
return
values_buffer;
70
}
71
72
template
<std::ranges::range R>
73
requires
(std::is_arithmetic_v<std::ranges::range_value_t<R>>)
74
[[nodiscard]]
buffer<uint8_t>
range_to_buffer
(R&& range)
75
{
76
const
size_t
values_byte_count = std::ranges::size(range) *
sizeof
(std::ranges::range_value_t<R>);
77
buffer<uint8_t>
values_buffer(values_byte_count,
buffer<uint8_t>::default_allocator
());
78
auto
buffer_adaptor
=
make_buffer_adaptor<std::ranges::range_value_t<R>
>(values_buffer);
79
if
constexpr
(std::is_rvalue_reference_v<R>)
80
{
81
std::ranges::move(range,
buffer_adaptor
.
begin
());
82
}
83
else
84
{
85
sparrow::ranges::copy
(range,
buffer_adaptor
.
begin
());
86
}
87
88
return
values_buffer;
89
}
90
}
buffer.hpp
buffer_adaptor.hpp
sparrow::buffer_adaptor
Class which has internally a reference to a contiguous container of a certain type and provides an AP...
Definition
buffer_adaptor.hpp:58
sparrow::buffer_adaptor::begin
constexpr iterator begin() noexcept
Returns an iterator to the beginning.
Definition
buffer_adaptor.hpp:551
sparrow::buffer
Object that owns a piece of contiguous memory.
Definition
buffer.hpp:131
sparrow::buffer::default_allocator
xsimd::aligned_allocator< T > default_allocator
Definition
buffer.hpp:144
sparrow::ranges
Definition
ranges.hpp:88
sparrow::ranges::copy
constexpr std::ranges::copy_result< std::ranges::borrowed_iterator_t< R >, O > copy(R &&r, O result)
Definition
ranges.hpp:132
sparrow
Definition
array.hpp:21
sparrow::range_to_buffer
buffer< uint8_t > range_to_buffer(R &&range)
Definition
buffers.hpp:74
sparrow::strings_to_buffer
buffer< uint8_t > strings_to_buffer(R &&strings)
Definition
buffers.hpp:46
sparrow::make_buffer_adaptor
auto make_buffer_adaptor(FromBufferRef &buf)
Definition
buffer_adaptor.hpp:880
sparrow::number_of_bytes
size_t number_of_bytes(const R &ranges)
Definition
buffers.hpp:29
ranges.hpp
sparrow
utils
buffers.hpp
Generated by
1.17.0