Ported the obj parser.

This commit is contained in:
zy4n
2025-04-01 21:51:56 +02:00
parent bc065bc657
commit 27977c1738
34 changed files with 1676 additions and 1554 deletions

View File

@@ -242,7 +242,7 @@ typename assets::detail::generic_basic_store<ID, T>::iterator assets::detail::ge
{
return iterator{
m_ids.data(),
m_data.begin(),
m_data.data(),
0
};
}
@@ -252,7 +252,7 @@ typename assets::detail::generic_basic_store<ID, T>::iterator assets::detail::ge
{
return iterator{
m_ids.data(),
m_data.begin(),
m_data.data(),
m_ids.size()
};
}
@@ -262,7 +262,7 @@ typename assets::detail::generic_basic_store<ID, T>::const_iterator assets::deta
{
return const_iterator{
m_ids.data(),
m_data.begin(),
m_data.data(),
0
};
}
@@ -272,7 +272,7 @@ typename assets::detail::generic_basic_store<ID, T>::const_iterator assets::deta
{
return const_iterator{
m_ids.data(),
m_data.begin(),
m_data.data(),
m_ids.size()
};
}

View File

@@ -13,13 +13,13 @@ template<typename... Ts>
assets::detail::generic_material_store_iterator<Ts...>::generic_material_store_iterator(
id_iterator_type ids,
const component_iterator_type& components,
flag_count_iterator_type flag_counts,
flag_iterator_type flags,
const size_type index,
const offsets_type& offsets
) :
m_ids{ ids },
m_components{ components },
m_flag_counts{ flag_counts },
m_flags{ flags },
m_index{ index },
m_offsets{ offsets } {}
@@ -31,7 +31,7 @@ typename assets::detail::generic_material_store_iterator<Ts...>::reference asset
template<typename... Ts>
assets::detail::generic_material_store_iterator<Ts...>& assets::detail::generic_material_store_iterator<Ts...>::operator++() {
adjust_offsets(std::index_sequence_for<Ts...>{}, 1);
calc_offsets(std::index_sequence_for<Ts...>{}, 1);
++m_index;
return *this;
}
@@ -45,7 +45,7 @@ assets::detail::generic_material_store_iterator<Ts...> assets::detail::generic_m
template<typename... Ts>
assets::detail::generic_material_store_iterator<Ts...>& assets::detail::generic_material_store_iterator<Ts...>::operator--() {
adjust_offsets(std::index_sequence_for<Ts...>{}, -1);
calc_offsets(std::index_sequence_for<Ts...>{}, -1);
--m_index;
return *this;
}
@@ -60,7 +60,7 @@ assets::detail::generic_material_store_iterator<Ts...> assets::detail::generic_m
template<typename... Ts>
assets::detail::generic_material_store_iterator<Ts...>& assets::detail::generic_material_store_iterator<Ts...>::operator+=(const difference_type n)
{
adjust_offsets(std::index_sequence_for<Ts...>{}, n);
calc_offsets(std::index_sequence_for<Ts...>{}, n);
m_index += n;
return *this;
}
@@ -158,14 +158,12 @@ void assets::detail::generic_material_store_iterator<Ts...>::calc_offsets(
while (n--)
{
const auto& [ flags, index_count, component_count ] = m_flag_counts[m_index];
std::get<0>(m_offsets) += step * index_count;
const auto flags = m_flags[m_index];
([&] {
if (is_component_enabled<Is>(flags))
{
std::get<1 + Is>(m_offsets) += step * component_count;
std::get<Is>(m_offsets) += step;
}
}(), ...);
@@ -178,12 +176,13 @@ template<std::size_t... Is>
typename assets::detail::generic_material_store_iterator<Ts...>::reference
assets::detail::generic_material_store_iterator<Ts...>::dereference(std::index_sequence<Is...>) const
{
const auto& flags = m_flag_counts[m_index];
const auto& flags = m_flags[m_index];
return std::make_pair(
m_ids[m_index],
material_view{
.data = {
.component_flags = flags,
.components = {
(
is_component_enabled<Is>(flags)
? std::optional{ std::get<Is>(m_components)[m_offsets[Is]] }
@@ -197,7 +196,7 @@ assets::detail::generic_material_store_iterator<Ts...>::dereference(std::index_s
template<typename... Ts>
std::tuple<std::add_pointer_t<Ts>...> assets::detail::generic_material_store<z3d::structure<Ts...>>::component_iterators()
{
return [&]<auto... Is>(std::index_sequence<Is>)
return [&]<auto... Is>(std::index_sequence<Is...>)
{
return std::make_tuple(std::get<Is>(m_component_arrays).data()...);
}
@@ -207,7 +206,7 @@ std::tuple<std::add_pointer_t<Ts>...> assets::detail::generic_material_store<z3d
template<typename... Ts>
std::tuple<std::add_pointer_t<std::add_const_t<Ts>>...> assets::detail::generic_material_store<z3d::structure<Ts...>>::component_iterators() const
{
return [&]<auto... Is>(std::index_sequence<Is>)
return [&]<auto... Is>(std::index_sequence<Is...>)
{
return std::make_tuple(std::get<Is>(m_component_arrays).data()...);
}
@@ -218,7 +217,7 @@ template<typename... Ts>
std::array<typename assets::detail::generic_material_store<z3d::structure<Ts...>>::count_type, 1 + sizeof...(Ts)>
assets::detail::generic_material_store<z3d::structure<Ts...>>::array_counts() const
{
return [&]<auto... Is>(std::index_sequence<Is>)
return [&]<auto... Is>(std::index_sequence<Is...>)
{
return std::array{
std::get<Is>(m_component_arrays).size()...
@@ -279,35 +278,37 @@ bool assets::detail::generic_material_store<z3d::structure<Ts...>>::unsafe_inser
auto& dst_component_flags = m_component_flag_counts[index];
[&]<auto... Is>(std::integer_sequence<Is...>)
[&]<auto... Is>(std::index_sequence<Is...>)
{
const auto is_component_enabled = src_component_flags & component_flag_type{ 1 } << Is;
const auto was_component_enabled = (
new_entry
? static_cast<bool>(dst_component_flags & component_flag_type{ 1 } << Is)
: component_flag_type{}
);
([&] {
const auto is_component_enabled = static_cast<bool>(src_component_flags & component_flag_type{ 1 } << Is);
const auto was_component_enabled = (
new_entry
? static_cast<bool>(dst_component_flags & component_flag_type{ 1 } << Is)
: false
);
const auto& src_component = std::get<Is>(data.components);
auto& dst_component_array = std::get<Is>(m_component_arrays);
const auto component_index = it.m_offsets[Is];
const auto dst_component_it = dst_component_array.begin() + component_index;
const auto& src_component = std::get<Is>(data.components);
auto& dst_component_array = std::get<Is>(m_component_arrays);
const auto component_index = it.m_offsets[Is];
const auto dst_component_it = dst_component_array.begin() + component_index;
if (is_component_enabled)
{
if (was_component_enabled)
if (is_component_enabled)
{
*dst_component_it = *src_component;
if (was_component_enabled)
{
*dst_component_it = *src_component;
}
else
{
dst_component_array.insert(dst_component_it, *src_component);
}
}
else
else if (was_component_enabled)
{
dst_component_array.insert(dst_component_it, *src_component);
dst_component_array.erase(dst_component_it);
}
}
else if (was_component_enabled)
{
dst_component_array.erase(dst_component_it);
}
}, ...);
}
(std::index_sequence_for<Ts...>{});
@@ -347,10 +348,12 @@ void assets::detail::generic_material_store<z3d::structure<Ts...>>::remove(const
m_ids.erase(m_ids.begin() + it.m_index);
return [&]<auto... Is>(std::index_sequence<Is>)
return [&]<auto... Is>(std::index_sequence<Is...>)
{
auto& component_array = std::get<Is>(m_component_arrays);
(component_array.erase(component_array.begin() + it.m_offsets[Is]), ...);
([&] {
auto& component_array = std::get<Is>(m_component_arrays);
(component_array.erase(component_array.begin() + it.m_offsets[Is]), ...);
}, ...);
} (std::index_sequence_for<Ts...>{});
m_component_flag_counts.erase(m_component_flag_counts.begin() + it.m_index);
@@ -362,9 +365,9 @@ void assets::detail::generic_material_store<z3d::structure<Ts...>>::clear()
auto lock = std::unique_lock{ m_mutex };
m_ids.clear();
[&]<auto... Is>(std::index_sequence<Is>)
[&]<auto... Is>(std::index_sequence<Is...>)
{
std::get<Is>(m_component_arrays).clear();
(std::get<Is>(m_component_arrays).clear(), ...);
} (std::index_sequence_for<Ts...>{});
m_component_flag_counts.clear();
}

View File

@@ -14,7 +14,7 @@
template<typename... Ts>
assets::detail::generic_mesh_store_iterator<Ts...>::generic_mesh_store_iterator(
id_iterator_type ids,
index_iterator_type indices,
triangle_iterator_type triangles,
const component_iterator_type& components,
material_id_iterator_type material_ids,
flag_count_iterator_type flag_counts,
@@ -22,7 +22,7 @@ assets::detail::generic_mesh_store_iterator<Ts...>::generic_mesh_store_iterator(
const offsets_type& offsets
) :
m_ids{ ids },
m_indices{ indices },
m_triangles{ triangles },
m_components{ components },
m_material_ids{ material_ids },
m_flag_counts{ flag_counts },
@@ -37,7 +37,7 @@ typename assets::detail::generic_mesh_store_iterator<Ts...>::reference assets::d
template<typename... Ts>
assets::detail::generic_mesh_store_iterator<Ts...>& assets::detail::generic_mesh_store_iterator<Ts...>::operator++() {
adjust_offsets(std::index_sequence_for<Ts...>{}, 1);
calc_offsets(std::index_sequence_for<Ts...>{}, 1);
++m_index;
return *this;
}
@@ -51,7 +51,7 @@ assets::detail::generic_mesh_store_iterator<Ts...> assets::detail::generic_mesh_
template<typename... Ts>
assets::detail::generic_mesh_store_iterator<Ts...>& assets::detail::generic_mesh_store_iterator<Ts...>::operator--() {
adjust_offsets(std::index_sequence_for<Ts...>{}, -1);
calc_offsets(std::index_sequence_for<Ts...>{}, -1);
--m_index;
return *this;
}
@@ -66,7 +66,7 @@ assets::detail::generic_mesh_store_iterator<Ts...> assets::detail::generic_mesh_
template<typename... Ts>
assets::detail::generic_mesh_store_iterator<Ts...>& assets::detail::generic_mesh_store_iterator<Ts...>::operator+=(const difference_type n)
{
adjust_offsets(std::index_sequence_for<Ts...>{}, n);
calc_offsets(std::index_sequence_for<Ts...>{}, n);
m_index += n;
return *this;
}
@@ -209,7 +209,7 @@ assets::detail::generic_mesh_store_iterator<Ts...>::dereference(std::index_seque
template<typename... Ts>
std::tuple<std::add_pointer_t<Ts>...> assets::detail::generic_mesh_store<z3d::structure<Ts...>>::component_iterators()
{
return [&]<auto... Is>(std::index_sequence<Is>)
return [&]<auto... Is>(std::index_sequence<Is...>)
{
return std::make_tuple(std::get<Is>(m_component_arrays).data()...);
}
@@ -219,7 +219,7 @@ std::tuple<std::add_pointer_t<Ts>...> assets::detail::generic_mesh_store<z3d::st
template<typename... Ts>
std::tuple<std::add_pointer_t<std::add_const_t<Ts>>...> assets::detail::generic_mesh_store<z3d::structure<Ts...>>::component_iterators() const
{
return [&]<auto... Is>(std::index_sequence<Is>)
return [&]<auto... Is>(std::index_sequence<Is...>)
{
return std::make_tuple(std::get<Is>(m_component_arrays).data()...);
}
@@ -230,7 +230,7 @@ template<typename... Ts>
std::array<typename assets::detail::generic_mesh_store<z3d::structure<Ts...>>::count_type, 1 + sizeof...(Ts)>
assets::detail::generic_mesh_store<z3d::structure<Ts...>>::array_counts() const
{
return [&]<auto... Is>(std::index_sequence<Is>)
return [&]<auto... Is>(std::index_sequence<Is...>)
{
return std::array{
m_triangles.size(),
@@ -289,18 +289,20 @@ bool assets::detail::generic_mesh_store<z3d::structure<Ts...>>::unsafe_insert(it
: std::numeric_limits<count_type>::max()
);
[&]<auto... Is>(std::integer_sequence<Is...>)
[&]<auto... Is>(std::index_sequence<Is...>)
{
const auto& component_array = std::get<Is>(data.component_arrays);
if (not component_array.empty())
{
// TODO check count
const auto component_count = static_cast<count_type>(component_array.size());
if (component_count != 0 and component_count < vertex_count)
([&] {
const auto& component_array = std::get<Is>(data.component_arrays);
if (not component_array.empty())
{
vertex_count = component_count;
// TODO check count
const auto component_count = static_cast<count_type>(component_array.size());
if (component_count != 0 and component_count < vertex_count)
{
vertex_count = component_count;
}
}
}
}, ...);
}
(std::index_sequence_for<Ts...>{});
@@ -339,27 +341,33 @@ bool assets::detail::generic_mesh_store<z3d::structure<Ts...>>::unsafe_insert(it
data.triangles().end()
);
[&]<auto... Is>(std::integer_sequence<Is...>)
[&]<auto... Is>(std::index_sequence<Is...>)
{
const auto is_component_enabled = src_component_flags & component_flag_type{ 1 } << Is;
const auto was_component_enabled = (
new_entry
? static_cast<bool>(dst_component_flags & component_flag_type{ 1 } << Is)
: component_flag_type{}
);
([&] {
const auto is_component_enabled = static_cast<bool>(src_component_flags & component_flag_type{ 1 } << Is);
const auto was_component_enabled = (
new_entry
? static_cast<bool>(dst_component_flags & component_flag_type{ 1 } << Is)
: false
);
const auto& src_component_array = std::get<Is>(data.component_arrays);
auto& dst_component_array = std::get<Is>(m_component_arrays);
const auto component_index = it.m_offsets[1 + Is];
const auto dst_component_it = dst_component_array.begin() + component_index;
const auto src_component_count = is_component_enabled ? vertex_count : count_type{};
const auto dst_component_count = was_component_enabled ? dst_vertex_count : count_type{};
ztu::replace_range(
dst_component_array,
dst_component_it,
dst_component_it + dst_vertex_count,
src_component_array.begin(),
src_component_array.begin() + vertex_count
);
const auto& src_component_array = std::get<Is>(data.component_arrays);
auto& dst_component_array = std::get<Is>(m_component_arrays);
const auto component_index = it.m_offsets[1 + Is];
const auto dst_component_it = dst_component_array.begin() + component_index;
ztu::replace_range(
dst_component_array,
dst_component_it,
dst_component_it + dst_component_count,
src_component_array.begin(),
src_component_array.begin() + src_component_count
);
}, ...);
}
(std::index_sequence_for<Ts...>{});
@@ -404,7 +412,7 @@ void assets::detail::generic_mesh_store<z3d::structure<Ts...>>::remove(const ite
m_component_flag_counts.erase(m_component_flag_counts.begin() + index);
[&]<auto... Is>(std::index_sequence<Is>)
[&]<auto... Is>(std::index_sequence<Is...>)
{
([&]{
if ( component_flags & component_flag_type{ 1 } << Is)
@@ -426,9 +434,9 @@ void assets::detail::generic_mesh_store<z3d::structure<Ts...>>::clear()
m_ids.clear();
m_triangles.clear();
[&]<auto... Is>(std::index_sequence<Is>)
[&]<auto... Is>(std::index_sequence<Is...>)
{
std::get<Is>(m_component_arrays).clear();
(std::get<Is>(m_component_arrays).clear(), ...);
} (std::index_sequence_for<Ts...>{});
m_component_flag_counts.clear();
m_material_ids.clear();

View File

@@ -198,7 +198,7 @@ assets::detail::generic_point_cloud_store_iterator<Ts...>::dereference(std::inde
template<typename... Ts>
std::tuple<std::add_pointer_t<Ts>...> assets::detail::generic_point_cloud_store<z3d::structure<Ts...>>::component_iterators()
{
return [&]<auto... Is>(std::index_sequence<Is>)
return [&]<auto... Is>(std::index_sequence<Is...>)
{
return std::make_tuple(std::get<Is>(m_component_arrays).data()...);
}
@@ -208,7 +208,7 @@ std::tuple<std::add_pointer_t<Ts>...> assets::detail::generic_point_cloud_store<
template<typename... Ts>
std::tuple<std::add_pointer_t<std::add_const_t<Ts>>...> assets::detail::generic_point_cloud_store<z3d::structure<Ts...>>::component_iterators() const
{
return [&]<auto... Is>(std::index_sequence<Is>)
return [&]<auto... Is>(std::index_sequence<Is...>)
{
return std::make_tuple(std::get<Is>(m_component_arrays).data()...);
}
@@ -219,7 +219,7 @@ template<typename... Ts>
std::array<typename assets::detail::generic_point_cloud_store<z3d::structure<Ts...>>::count_type, 1 + sizeof...(Ts)>
assets::detail::generic_point_cloud_store<z3d::structure<Ts...>>::array_counts() const
{
return [&]<auto... Is>(std::index_sequence<Is>)
return [&]<auto... Is>(std::index_sequence<Is...>)
{
return std::array{
std::get<Is>(m_component_arrays).size()...
@@ -268,18 +268,20 @@ bool assets::detail::generic_point_cloud_store<z3d::structure<Ts...>>::unsafe_in
: std::numeric_limits<count_type>::max()
);
[&]<auto... Is>(std::integer_sequence<Is...>)
[&]<auto... Is>(std::index_sequence<Is...>)
{
const auto& component_array = std::get<Is>(data.component_arrays);
if (not component_array.empty())
{
// TODO check count
const auto component_count = static_cast<count_type>(component_array.size());
if (component_count != 0 and component_count < vertex_count)
([&] {
const auto& component_array = std::get<Is>(data.component_arrays);
if (not component_array.empty())
{
vertex_count = component_count;
// TODO check count
const auto component_count = static_cast<count_type>(component_array.size());
if (component_count != 0 and component_count < vertex_count)
{
vertex_count = component_count;
}
}
}
}, ...);
}
(std::index_sequence_for<Ts...>{});
@@ -305,27 +307,29 @@ bool assets::detail::generic_point_cloud_store<z3d::structure<Ts...>>::unsafe_in
m_component_flag_counts[index] = src_component_flag_count;
}
[&]<auto... Is>(std::integer_sequence<Is...>)
[&]<auto... Is>(std::index_sequence<Is...>)
{
const auto is_component_enabled = src_component_flags & component_flag_type{ 1 } << Is;
const auto was_component_enabled = (
new_entry
? static_cast<bool>(dst_component_flags & component_flag_type{ 1 } << Is)
: component_flag_type{}
);
([&] {
const auto is_component_enabled = src_component_flags & component_flag_type{ 1 } << Is;
const auto was_component_enabled = (
new_entry
? static_cast<bool>(dst_component_flags & component_flag_type{ 1 } << Is)
: component_flag_type{}
);
const auto& src_component_array = std::get<Is>(data.component_arrays);
auto& dst_component_array = std::get<Is>(m_component_arrays);
const auto component_index = it.m_offsets[1 + Is];
const auto dst_component_it = dst_component_array.begin() + component_index;
const auto& src_component_array = std::get<Is>(data.component_arrays);
auto& dst_component_array = std::get<Is>(m_component_arrays);
const auto component_index = it.m_offsets[1 + Is];
const auto dst_component_it = dst_component_array.begin() + component_index;
ztu::replace_range(
dst_component_array,
dst_component_it,
dst_component_it + dst_vertex_count,
src_component_array.begin(),
src_component_array.begin() + vertex_count
);
ztu::replace_range(
dst_component_array,
dst_component_it,
dst_component_it + dst_vertex_count,
src_component_array.begin(),
src_component_array.begin() + vertex_count
);
}, ...);
}
(std::index_sequence_for<Ts...>{});
@@ -368,7 +372,7 @@ void assets::detail::generic_point_cloud_store<z3d::structure<Ts...>>::remove(co
m_component_flag_counts.erase(m_component_flag_counts.begin() + index);
[&]<auto... Is>(std::index_sequence<Is>)
[&]<auto... Is>(std::index_sequence<Is...>)
{
([&]{
if ( component_flags & component_flag_type{ 1 } << Is)
@@ -387,9 +391,9 @@ void assets::detail::generic_point_cloud_store<z3d::structure<Ts...>>::clear()
auto lock = std::unique_lock{ m_mutex };
m_ids.clear();
[&]<auto... Is>(std::index_sequence<Is>)
[&]<auto... Is>(std::index_sequence<Is...>)
{
std::get<Is>(m_component_arrays).clear();
(std::get<Is>(m_component_arrays).clear(), ...);
} (std::index_sequence_for<Ts...>{});
m_component_flag_counts.clear();
}

View File

@@ -27,12 +27,12 @@ assets::pose_list_store_iterator<Char>::pose_list_store_iterator(
template<typename Char>
typename assets::pose_list_store_iterator<Char>::reference assets::pose_list_store_iterator<Char>::operator*() const {
return dereference(std::index_sequence_for<Char>{});
return dereference();
}
template<typename Char>
assets::pose_list_store_iterator<Char>& assets::pose_list_store_iterator<Char>::operator++() {
adjust_offsets(std::index_sequence_for<Char>{}, 1);
calc_offset(1);
++m_index;
return *this;
}
@@ -46,7 +46,7 @@ assets::pose_list_store_iterator<Char> assets::pose_list_store_iterator<Char>::o
template<typename Char>
assets::pose_list_store_iterator<Char>& assets::pose_list_store_iterator<Char>::operator--() {
adjust_offsets(std::index_sequence_for<Char>{}, -1);
calc_offset(-1);
--m_index;
return *this;
}
@@ -61,7 +61,7 @@ assets::pose_list_store_iterator<Char> assets::pose_list_store_iterator<Char>::o
template<typename Char>
assets::pose_list_store_iterator<Char>& assets::pose_list_store_iterator<Char>::operator+=(const difference_type n)
{
adjust_offsets(std::index_sequence_for<Char>{}, n);
calc_offset(n);
m_index += n;
return *this;
}

View File

@@ -30,12 +30,12 @@ assets::shader_source_store_iterator<Char>::shader_source_store_iterator(
template<typename Char>
typename assets::shader_source_store_iterator<Char>::reference assets::shader_source_store_iterator<Char>::operator*() const {
return dereference(std::index_sequence_for<Char>{});
return dereference();
}
template<typename Char>
assets::shader_source_store_iterator<Char>& assets::shader_source_store_iterator<Char>::operator++() {
adjust_offsets(std::index_sequence_for<Char>{}, 1);
calc_offset(1);
++m_index;
return *this;
}
@@ -49,7 +49,7 @@ assets::shader_source_store_iterator<Char> assets::shader_source_store_iterator<
template<typename Char>
assets::shader_source_store_iterator<Char>& assets::shader_source_store_iterator<Char>::operator--() {
adjust_offsets(std::index_sequence_for<Char>{}, -1);
calc_offset(-1);
--m_index;
return *this;
}
@@ -64,7 +64,7 @@ assets::shader_source_store_iterator<Char> assets::shader_source_store_iterator<
template<typename Char>
assets::shader_source_store_iterator<Char>& assets::shader_source_store_iterator<Char>::operator+=(const difference_type n)
{
adjust_offsets(std::index_sequence_for<Char>{}, n);
calc_offset(n);
m_index += n;
return *this;
}
@@ -172,7 +172,7 @@ assets::shader_source_store_iterator<Char>::dereference() const
);
}
bool assets::shader_source_store::insert(const id_type id, const data_type& data)
inline bool assets::shader_source_store::insert(const id_type id, const data_type& data)
{
auto lock = std::unique_lock{ m_mutex };
@@ -181,10 +181,21 @@ bool assets::shader_source_store::insert(const id_type id, const data_type& data
return insert(result.first, id, data);
}
inline std::pair<assets::shader_source_store::iterator, bool> assets::shader_source_store::find(id_type id)
{
auto lock = std::shared_lock{ m_mutex };
return unsafe_find(id);
}
template<typename... Ts>
bool assets::shader_source_store::insert(iterator it, const id_type id, const data_type& data)
inline std::pair<assets::shader_source_store::const_iterator, bool> assets::shader_source_store::find(id_type id) const
{
auto lock = std::shared_lock{ m_mutex };
return unsafe_find(id);
}
inline bool assets::shader_source_store::unsafe_insert(iterator it, const id_type id, const data_type& data)
{
auto lock = std::unique_lock{ m_mutex };
@@ -223,10 +234,8 @@ bool assets::shader_source_store::insert(iterator it, const id_type id, const da
return new_entry;
}
inline std::pair<assets::shader_source_store::iterator, bool> assets::shader_source_store::find(id_type id)
inline std::pair<assets::shader_source_store::iterator, bool> assets::shader_source_store::unsafe_find(id_type id)
{
auto lock = std::shared_lock{ m_mutex };
const auto it = std::ranges::lower_bound(m_ids, id);
const auto found = it != m_ids.end() and *it == id;
@@ -235,10 +244,8 @@ inline std::pair<assets::shader_source_store::iterator, bool> assets::shader_sou
return { begin() + index, found };
}
inline std::pair<assets::shader_source_store::const_iterator, bool> assets::shader_source_store::find(id_type id) const
inline std::pair<assets::shader_source_store::const_iterator, bool> assets::shader_source_store::unsafe_find(id_type id) const
{
auto lock = std::shared_lock{ m_mutex };
const auto it = std::ranges::lower_bound(m_ids, id);
const auto found = it != m_ids.end() and *it == id;
@@ -251,14 +258,16 @@ void assets::shader_source_store::remove(const iterator& it)
{
auto lock = std::unique_lock{ m_mutex };
m_ids.erase(m_ids.begin() + it.m_index);
const auto index = it.m_index;
m_ids.erase(m_ids.begin() + index);
const auto strings_begin = m_strings.begin() + it.m_offset;
const auto strings_end = begin + it.m_lengths[it.m_index] + sizeof('\0');
const auto strings_end = strings_begin + it.m_lengths[it.m_index] + sizeof('\0');
m_strings.erase(strings_begin, strings_end);
m_lengths.erase(m_lengths.begin() + it.m_index);
m_metadata.erase(m_metadata.begin() + it.m_index);
m_lengths.erase(m_lengths.begin() + index);
m_metadata.erase(m_metadata.begin() + index);
}
void assets::shader_source_store::clear()