Skip to content

Commit 6372ceb

Browse files
laramielcopybara-github
authored andcommitted
Add more big_endian/little_endian utilities
Abseil made their endian utilities private; create variants for tensorstore use. PiperOrigin-RevId: 753055518 Change-Id: Icd0ed0137b3e62bc7fe4e95d185b1d75a471bc0f
1 parent 3c4da5b commit 6372ceb

File tree

19 files changed

+358
-75
lines changed

19 files changed

+358
-75
lines changed

tensorstore/internal/compression/BUILD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ tensorstore_cc_library(
111111
srcs = ["neuroglancer_compressed_segmentation.cc"],
112112
hdrs = ["neuroglancer_compressed_segmentation.h"],
113113
deps = [
114-
"@abseil-cpp//absl/base:endian",
114+
"//tensorstore/util:endian",
115115
"@abseil-cpp//absl/container:flat_hash_map",
116116
],
117117
)

tensorstore/internal/compression/neuroglancer_compressed_segmentation.cc

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
#include <string_view>
2424
#include <vector>
2525

26-
#include "absl/base/internal/endian.h"
2726
#include "absl/container/flat_hash_map.h"
27+
#include "tensorstore/util/endian.h"
2828

2929
namespace tensorstore {
3030
namespace neuroglancer_compressed_segmentation {
@@ -34,10 +34,9 @@ constexpr size_t kBlockHeaderSize = 2;
3434
void WriteBlockHeader(size_t encoded_value_base_offset,
3535
size_t table_base_offset, size_t encoding_bits,
3636
void* output) {
37-
absl::little_endian::Store32(output,
38-
table_base_offset | (encoding_bits << 24));
39-
absl::little_endian::Store32(static_cast<char*>(output) + 4,
40-
encoded_value_base_offset);
37+
little_endian::Store32(output, table_base_offset | (encoding_bits << 24));
38+
little_endian::Store32(static_cast<char*>(output) + 4,
39+
encoded_value_base_offset);
4140
}
4241

4342
template <typename Label>
@@ -136,9 +135,9 @@ void EncodeBlock(const Label* input, const ptrdiff_t input_shape[3],
136135
uint32_t index = seen_values.at(value);
137136
size_t output_offset = x + block_shape[2] * (y + block_shape[1] * z);
138137
void* cur_ptr = output_ptr + output_offset * encoded_bits / 32 * 4;
139-
absl::little_endian::Store32(
140-
cur_ptr, absl::little_endian::Load32(cur_ptr) |
141-
(index << (output_offset * encoded_bits % 32)));
138+
little_endian::Store32(cur_ptr,
139+
little_endian::Load32(cur_ptr) |
140+
(index << (output_offset * encoded_bits % 32)));
142141
});
143142

144143
// Write table
@@ -147,9 +146,8 @@ void EncodeBlock(const Label* input, const ptrdiff_t input_shape[3],
147146
output->data() + encoded_value_base_offset + encoded_size_32bits * 4;
148147
for (auto value : seen_values_inv) {
149148
for (size_t word_i = 0; word_i < num_32bit_words_per_label; ++word_i) {
150-
absl::little_endian::Store32(
151-
output_ptr + word_i * 4,
152-
static_cast<uint32_t>(value >> (32 * word_i)));
149+
little_endian::Store32(output_ptr + word_i * 4,
150+
static_cast<uint32_t>(value >> (32 * word_i)));
153151
}
154152
output_ptr += num_32bit_words_per_label * 4;
155153
}
@@ -206,8 +204,8 @@ void EncodeChannels(const Label* input, const ptrdiff_t input_shape[3 + 1],
206204
const size_t base_offset = output->size();
207205
output->resize(base_offset + input_shape[0] * 4);
208206
for (ptrdiff_t channel_i = 0; channel_i < input_shape[0]; ++channel_i) {
209-
absl::little_endian::Store32(output->data() + base_offset + channel_i * 4,
210-
(output->size() - base_offset) / 4);
207+
little_endian::Store32(output->data() + base_offset + channel_i * 4,
208+
(output->size() - base_offset) / 4);
211209
EncodeChannel(
212210
reinterpret_cast<const Label*>(reinterpret_cast<const char*>(input) +
213211
input_byte_strides[0] * channel_i),
@@ -217,7 +215,7 @@ void EncodeChannels(const Label* input, const ptrdiff_t input_shape[3 + 1],
217215

218216
void ReadBlockHeader(const void* header, size_t* encoded_value_base_offset,
219217
size_t* table_base_offset, size_t* encoding_bits) {
220-
auto h = absl::little_endian::Load64(header);
218+
auto h = little_endian::Load64(header);
221219
*table_base_offset = h & 0xffffff;
222220
*encoding_bits = (h >> 24) & 0xff;
223221
*encoded_value_base_offset = (h >> 32) & 0xffffff;
@@ -258,9 +256,9 @@ bool DecodeBlock(size_t encoded_bits, const char* encoded_input,
258256
// Returns the label at the specified table index.
259257
const auto read_label = [&](size_t index) -> Label {
260258
if constexpr (sizeof(Label) == 4) {
261-
return absl::little_endian::Load32(table_input + index * sizeof(Label));
259+
return little_endian::Load32(table_input + index * sizeof(Label));
262260
} else {
263-
return absl::little_endian::Load64(table_input + index * sizeof(Label));
261+
return little_endian::Load64(table_input + index * sizeof(Label));
264262
}
265263
};
266264

@@ -279,7 +277,7 @@ bool DecodeBlock(size_t encoded_bits, const char* encoded_input,
279277
return for_each_position([&](Label& output_label, ptrdiff_t z, ptrdiff_t y,
280278
ptrdiff_t x) {
281279
size_t encoded_offset = x + block_shape[2] * (y + block_shape[1] * z);
282-
auto index = absl::little_endian::Load32(
280+
auto index = little_endian::Load32(
283281
encoded_input + encoded_offset * encoded_bits / 32 * 4) >>
284282
(encoded_offset * encoded_bits % 32) &
285283
encoded_value_mask;
@@ -368,8 +366,7 @@ bool DecodeChannels(std::string_view input, const ptrdiff_t block_shape[3],
368366
return false;
369367
}
370368
for (ptrdiff_t channel_i = 0; channel_i < output_shape[0]; ++channel_i) {
371-
const size_t offset =
372-
absl::little_endian::Load32(input.data() + channel_i * 4);
369+
const size_t offset = little_endian::Load32(input.data() + channel_i * 4);
373370
if (offset > input.size() / 4) {
374371
// channel offset is invalid
375372
return false;

tensorstore/kvstore/BUILD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ tensorstore_cc_library(
8181
deps = [
8282
"//tensorstore/serialization",
8383
"//tensorstore/serialization:absl_time",
84+
"//tensorstore/util:endian",
8485
"//tensorstore/util:quote_string",
85-
"@abseil-cpp//absl/base:endian",
8686
"@abseil-cpp//absl/strings",
8787
"@abseil-cpp//absl/time",
8888
],

tensorstore/kvstore/generation.cc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@
2626
#include <string_view>
2727
#include <utility>
2828

29-
#include "absl/base/internal/endian.h"
3029
#include "absl/strings/str_cat.h"
3130
#include "absl/time/time.h"
3231
#include "tensorstore/serialization/absl_time.h" // IWYU pragma: keep
3332
#include "tensorstore/serialization/fwd.h"
3433
#include "tensorstore/serialization/serialization.h"
34+
#include "tensorstore/util/endian.h"
3535
#include "tensorstore/util/quote_string.h"
3636

3737
namespace tensorstore {
@@ -97,7 +97,7 @@ std::string StorageGeneration::DebugString() const {
9797
absl::StrAppend(&output, "|");
9898
}
9999
assert(i + 8 <= value.size()); // Already ensured by `Validate()`
100-
uint64_t id = absl::little_endian::Load64(&value[i]);
100+
uint64_t id = little_endian::Load64(&value[i]);
101101
i += 8;
102102
absl::StrAppend(&output, "M", id);
103103
}
@@ -179,23 +179,23 @@ StorageGeneration StorageGeneration::Clean(StorageGeneration generation) {
179179

180180
bool StorageGeneration::LastMutatedBy(MutationId id) const {
181181
return value.size() >= 9 && (value[0] & kMutation) &&
182-
absl::little_endian::Load64(&value[1]) == id;
182+
little_endian::Load64(&value[1]) == id;
183183
}
184184

185185
void StorageGeneration::MarkDirty(MutationId mutation_id) {
186186
if (value.empty()) {
187187
value.resize(9);
188-
absl::little_endian::Store64(&value[1], mutation_id);
188+
little_endian::Store64(&value[1], mutation_id);
189189
value[0] = kMutation;
190190
} else {
191191
if (value[0] & kMutation) {
192192
char buffer[9];
193193
buffer[0] = kMutation | kAdditionalTags;
194-
absl::little_endian::Store64(&buffer[1], mutation_id);
194+
little_endian::Store64(&buffer[1], mutation_id);
195195
value.insert(0, buffer, 9);
196196
} else {
197197
char buffer[8];
198-
absl::little_endian::Store64(&buffer[0], mutation_id);
198+
little_endian::Store64(&buffer[0], mutation_id);
199199
value.insert(1, buffer, 8);
200200
value[0] |= kMutation;
201201
}

tensorstore/kvstore/neuroglancer_uint64_sharded/BUILD

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,12 @@ tensorstore_cc_library(
7474
"//tensorstore/internal:cord_util",
7575
"//tensorstore/internal/compression:zlib",
7676
"//tensorstore/kvstore:byte_range",
77+
"//tensorstore/util:endian",
7778
"//tensorstore/util:result",
7879
"//tensorstore/util:span",
7980
"//tensorstore/util:status",
8081
"//tensorstore/util:str_cat",
8182
"@abseil-cpp//absl/algorithm:container",
82-
"@abseil-cpp//absl/base:endian",
8383
"@abseil-cpp//absl/status",
8484
"@abseil-cpp//absl/strings:cord",
8585
],
@@ -109,11 +109,11 @@ tensorstore_cc_library(
109109
"//tensorstore/internal:flat_cord_builder",
110110
"//tensorstore/internal/compression:zlib",
111111
"//tensorstore/kvstore:byte_range",
112+
"//tensorstore/util:endian",
112113
"//tensorstore/util:result",
113114
"//tensorstore/util:span",
114115
"//tensorstore/util:status",
115116
"//tensorstore/util:str_cat",
116-
"@abseil-cpp//absl/base:endian",
117117
"@abseil-cpp//absl/functional:function_ref",
118118
"@abseil-cpp//absl/status",
119119
"@abseil-cpp//absl/strings:cord",
@@ -176,7 +176,6 @@ tensorstore_cc_library(
176176
"//tensorstore/util/execution:sender_util",
177177
"//tensorstore/util/garbage_collection",
178178
"@abseil-cpp//absl/base:core_headers",
179-
"@abseil-cpp//absl/base:endian",
180179
"@abseil-cpp//absl/status",
181180
"@abseil-cpp//absl/strings:cord",
182181
"@abseil-cpp//absl/synchronization",

tensorstore/kvstore/neuroglancer_uint64_sharded/neuroglancer_uint64_sharded.cc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
#include <utility>
2828
#include <vector>
2929

30-
#include "absl/base/internal/endian.h"
3130
#include "absl/base/optimization.h"
3231
#include "absl/status/status.h"
3332
#include "absl/strings/cord.h"

tensorstore/kvstore/neuroglancer_uint64_sharded/uint64_sharded_decoder.cc

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@
2323
#include <vector>
2424

2525
#include "absl/algorithm/container.h"
26-
#include "absl/base/internal/endian.h"
2726
#include "absl/status/status.h"
2827
#include "absl/strings/cord.h"
2928
#include "tensorstore/internal/compression/zlib.h"
3029
#include "tensorstore/internal/cord_util.h"
3130
#include "tensorstore/kvstore/byte_range.h"
3231
#include "tensorstore/kvstore/neuroglancer_uint64_sharded/uint64_sharded.h"
32+
#include "tensorstore/util/endian.h"
3333
#include "tensorstore/util/result.h"
3434
#include "tensorstore/util/span.h"
3535
#include "tensorstore/util/status.h"
@@ -57,13 +57,13 @@ Result<std::vector<MinishardIndexEntry>> DecodeMinishardIndex(
5757
uint64_t byte_offset = 0;
5858
for (size_t i = 0; i < result.size(); ++i) {
5959
auto& entry = result[i];
60-
chunk_id.value += absl::little_endian::Load64(decoded_flat.data() + i * 8);
60+
chunk_id.value += little_endian::Load64(decoded_flat.data() + i * 8);
6161
entry.chunk_id = chunk_id;
62-
byte_offset += absl::little_endian::Load64(decoded_flat.data() + i * 8 +
63-
8 * result.size());
62+
byte_offset +=
63+
little_endian::Load64(decoded_flat.data() + i * 8 + 8 * result.size());
6464
entry.byte_range.inclusive_min = byte_offset;
65-
byte_offset += absl::little_endian::Load64(decoded_flat.data() + i * 8 +
66-
16 * result.size());
65+
byte_offset +=
66+
little_endian::Load64(decoded_flat.data() + i * 8 + 16 * result.size());
6767
entry.byte_range.exclusive_max = byte_offset;
6868
if (!entry.byte_range.SatisfiesInvariants()) {
6969
return absl::InvalidArgumentError(tensorstore::StrCat(
@@ -108,8 +108,8 @@ Result<ByteRange> DecodeShardIndexEntry(std::string_view input) {
108108
"Expected 16 bytes, but received: ", input.size(), " bytes"));
109109
}
110110
ByteRange r;
111-
r.inclusive_min = absl::little_endian::Load64(input.data());
112-
r.exclusive_max = absl::little_endian::Load64(input.data() + 8);
111+
r.inclusive_min = little_endian::Load64(input.data());
112+
r.exclusive_max = little_endian::Load64(input.data() + 8);
113113
if (!r.SatisfiesInvariants()) {
114114
return absl::FailedPreconditionError(
115115
tensorstore::StrCat("Shard index specified invalid byte range: ", r));

tensorstore/kvstore/neuroglancer_uint64_sharded/uint64_sharded_encoder.cc

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@
2121
#include <string>
2222
#include <utility>
2323

24-
#include "absl/base/internal/endian.h"
2524
#include "absl/functional/function_ref.h"
2625
#include "absl/status/status.h"
2726
#include "absl/strings/cord.h"
2827
#include "tensorstore/internal/compression/zlib.h"
2928
#include "tensorstore/internal/flat_cord_builder.h"
3029
#include "tensorstore/kvstore/byte_range.h"
3130
#include "tensorstore/kvstore/neuroglancer_uint64_sharded/uint64_sharded.h"
31+
#include "tensorstore/util/endian.h"
3232
#include "tensorstore/util/result.h"
3333
#include "tensorstore/util/span.h"
3434
#include "tensorstore/util/status.h"
@@ -44,12 +44,11 @@ absl::Cord EncodeMinishardIndex(
4444
int64_t prev_offset = 0;
4545
for (ptrdiff_t i = 0; i < minishard_index.size(); ++i) {
4646
const auto& e = minishard_index[i];
47-
absl::little_endian::Store64(builder.data() + i * 8,
48-
e.chunk_id.value - prev_chunk_id.value);
49-
absl::little_endian::Store64(
50-
builder.data() + minishard_index.size() * 8 + i * 8,
51-
e.byte_range.inclusive_min - prev_offset);
52-
absl::little_endian::Store64(
47+
little_endian::Store64(builder.data() + i * 8,
48+
e.chunk_id.value - prev_chunk_id.value);
49+
little_endian::Store64(builder.data() + minishard_index.size() * 8 + i * 8,
50+
e.byte_range.inclusive_min - prev_offset);
51+
little_endian::Store64(
5352
builder.data() + minishard_index.size() * 16 + i * 8,
5453
e.byte_range.exclusive_max - e.byte_range.inclusive_min);
5554
prev_chunk_id = e.chunk_id;
@@ -62,8 +61,8 @@ absl::Cord EncodeShardIndex(span<const ShardIndexEntry> shard_index) {
6261
internal::FlatCordBuilder builder(shard_index.size() * 16);
6362
for (ptrdiff_t i = 0; i < shard_index.size(); ++i) {
6463
const auto& e = shard_index[i];
65-
absl::little_endian::Store64(builder.data() + i * 16, e.inclusive_min);
66-
absl::little_endian::Store64(builder.data() + i * 16 + 8, e.exclusive_max);
64+
little_endian::Store64(builder.data() + i * 16, e.inclusive_min);
65+
little_endian::Store64(builder.data() + i * 16 + 8, e.exclusive_max);
6766
}
6867
return std::move(builder).Build();
6968
}

tensorstore/kvstore/ocdbt/distributed/BUILD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ tensorstore_cc_library(
154154
deps = [
155155
"//tensorstore/kvstore:key_range",
156156
"//tensorstore/kvstore/ocdbt/format",
157-
"@abseil-cpp//absl/base:endian",
157+
"//tensorstore/util:endian",
158158
"@blake3",
159159
],
160160
)

tensorstore/kvstore/ocdbt/distributed/btree_node_identifier.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@
1414

1515
#include "tensorstore/kvstore/ocdbt/distributed/btree_node_identifier.h"
1616

17+
#include <stdint.h>
18+
1719
#include <ostream>
1820
#include <string>
1921
#include <string_view>
2022

21-
#include "absl/base/internal/endian.h"
2223
#include <blake3.h>
2324
#include "tensorstore/kvstore/key_range.h"
25+
#include "tensorstore/util/endian.h"
2426

2527
namespace tensorstore {
2628
namespace internal_ocdbt {
@@ -38,7 +40,7 @@ std::string BtreeNodeIdentifier::GetKey(
3840
database_identifier.size());
3941
char header[3];
4042
header[0] = static_cast<char>(range.full() ? 0 : height);
41-
absl::little_endian::Store16(&header[1], range.inclusive_min.size());
43+
little_endian::Store16(&header[1], range.inclusive_min.size());
4244
blake3_hasher_update(&hasher, header, 3);
4345
blake3_hasher_update(&hasher, range.inclusive_min.data(),
4446
range.inclusive_min.size());

0 commit comments

Comments
 (0)