blob: bb9a95bcf219520a9278650dca2729aef3a00258 [file]
// Copyright 2025 The Pigweed Authors
//
// Licensed 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
//
// https://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.
#include "pw_containers/internal/var_len_entry.h"
namespace pw::containers::internal {
VarLenEntry<std::byte> VarLenEntryC::From(
const pw_InlineVarLenEntryQueue_Entry& entry) {
ByteSpan data1(reinterpret_cast<std::byte*>(entry.data_1), entry.size_1);
ByteSpan data2(reinterpret_cast<std::byte*>(entry.data_2), entry.size_2);
return VarLenEntry<std::byte>(data1, data2);
}
VarLenEntry<const std::byte> VarLenEntryC::From(
const pw_InlineVarLenEntryQueue_ConstEntry& entry) {
ConstByteSpan data1(reinterpret_cast<const std::byte*>(entry.data_1),
entry.size_1);
ConstByteSpan data2(reinterpret_cast<const std::byte*>(entry.data_2),
entry.size_2);
return VarLenEntry<const std::byte>(data1, data2);
}
pw_InlineVarLenEntryQueue_Entry VarLenEntryC::To(
const VarLenEntry<std::byte>& cxx_entry) {
return pw_InlineVarLenEntryQueue_Entry{
.data_1 = reinterpret_cast<uint8_t*>(cxx_entry.data1_.data()),
.size_1 = static_cast<uint32_t>(cxx_entry.data1_.size()),
.data_2 = reinterpret_cast<uint8_t*>(cxx_entry.data2_.data()),
.size_2 = static_cast<uint32_t>(cxx_entry.data2_.size()),
};
}
pw_InlineVarLenEntryQueue_ConstEntry VarLenEntryC::To(
const VarLenEntry<const std::byte>& cxx_entry) {
return pw_InlineVarLenEntryQueue_ConstEntry{
.data_1 = reinterpret_cast<const uint8_t*>(cxx_entry.data1_.data()),
.size_1 = static_cast<uint32_t>(cxx_entry.data1_.size()),
.data_2 = reinterpret_cast<const uint8_t*>(cxx_entry.data2_.data()),
.size_2 = static_cast<uint32_t>(cxx_entry.data2_.size()),
};
}
} // namespace pw::containers::internal
using pw::containers::internal::VarLenEntryC;
PW_EXTERN_C_START
uint32_t pw_InlineVarLenEntryQueue_Entry_Copy(
const pw_InlineVarLenEntryQueue_Entry* entry, void* dest, uint32_t count) {
auto cxx_entry = VarLenEntryC::From(*entry);
auto* ptr = reinterpret_cast<std::byte*>(dest);
return static_cast<uint32_t>(cxx_entry.copy(ptr, count));
}
uint32_t pw_InlineVarLenEntryQueue_ConstEntry_Copy(
const pw_InlineVarLenEntryQueue_ConstEntry* entry,
void* dest,
uint32_t count) {
auto cxx_entry = VarLenEntryC::From(*entry);
auto* ptr = reinterpret_cast<std::byte*>(dest);
return static_cast<uint32_t>(cxx_entry.copy(ptr, count));
}
uint8_t pw_InlineVarLenEntryQueue_Entry_At(
const pw_InlineVarLenEntryQueue_Entry* entry, size_t index) {
auto cxx_entry = VarLenEntryC::From(*entry);
return static_cast<uint8_t>(cxx_entry.at(index));
}
uint8_t pw_InlineVarLenEntryQueue_ConstEntry_At(
const pw_InlineVarLenEntryQueue_ConstEntry* entry, size_t index) {
auto cxx_entry = VarLenEntryC::From(*entry);
return static_cast<uint8_t>(cxx_entry.at(index));
}
PW_EXTERN_C_END