[ox/std] SmallMap fixes, add findIdx function
This commit is contained in:
		
							
								
								
									
										14
									
								
								deps/ox/src/ox/std/algorithm.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								deps/ox/src/ox/std/algorithm.hpp
									
									
									
									
										vendored
									
									
								
							@@ -9,13 +9,25 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include "def.hpp"
 | 
			
		||||
#include "error.hpp"
 | 
			
		||||
 | 
			
		||||
OX_CLANG_NOWARN_BEGIN(-Wunsafe-buffer-usage)
 | 
			
		||||
 | 
			
		||||
namespace ox {
 | 
			
		||||
 | 
			
		||||
template<typename It, typename T>
 | 
			
		||||
constexpr It find(It begin, It end, const T &value) {
 | 
			
		||||
constexpr ox::Result<size_t> findIdx(It begin, It end, T const&value) {
 | 
			
		||||
	auto it = begin;
 | 
			
		||||
	for (; it != end; ++it) {
 | 
			
		||||
		if (*it == value) {
 | 
			
		||||
			return it.offset();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return ox::Error{1, "item not found"};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename It, typename T>
 | 
			
		||||
constexpr It find(It begin, It end, T const&value) {
 | 
			
		||||
	for (; begin != end; ++begin) {
 | 
			
		||||
		if (*begin == value) {
 | 
			
		||||
			return begin;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								deps/ox/src/ox/std/smallmap.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								deps/ox/src/ox/std/smallmap.hpp
									
									
									
									
										vendored
									
									
								
							@@ -86,10 +86,10 @@ class SmallMap {
 | 
			
		||||
 | 
			
		||||
	private:
 | 
			
		||||
		template<typename KK>
 | 
			
		||||
		constexpr Pair const&access(PairVector const&pairs, KK const&key, bool &isNew) const;
 | 
			
		||||
		constexpr Pair const*access(PairVector const&pairs, KK const&key, bool &isNew) const;
 | 
			
		||||
 | 
			
		||||
		template<typename KK>
 | 
			
		||||
		constexpr Pair &access(PairVector &pairs, KK const&key, bool &isNew);
 | 
			
		||||
		constexpr Pair *access(PairVector &pairs, KK const&key, bool &isNew);
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -129,7 +129,7 @@ constexpr SmallMap<K, T, SmallSz> &SmallMap<K, T, SmallSz>::operator=(SmallMap<K
 | 
			
		||||
template<typename K, typename T, size_t SmallSz>
 | 
			
		||||
constexpr T &SmallMap<K, T, SmallSz>::operator[](MaybeView_t<K> const&k) {
 | 
			
		||||
	bool isNew{};
 | 
			
		||||
	auto p = &access(m_pairs, k, isNew);
 | 
			
		||||
	auto p = access(m_pairs, k, isNew);
 | 
			
		||||
	if (isNew) {
 | 
			
		||||
		p->key = k;
 | 
			
		||||
	}
 | 
			
		||||
@@ -138,7 +138,8 @@ constexpr T &SmallMap<K, T, SmallSz>::operator[](MaybeView_t<K> const&k) {
 | 
			
		||||
 | 
			
		||||
template<typename K, typename T, size_t SmallSz>
 | 
			
		||||
constexpr Result<T*> SmallMap<K, T, SmallSz>::at(MaybeView_t<K> const&k) noexcept {
 | 
			
		||||
	auto p = access(m_pairs, k);
 | 
			
		||||
	bool isNew{};
 | 
			
		||||
	auto p = access(m_pairs, k, isNew);
 | 
			
		||||
	if (!p) {
 | 
			
		||||
		return {nullptr, ox::Error(1, "value not found for given key")};
 | 
			
		||||
	}
 | 
			
		||||
@@ -147,7 +148,8 @@ constexpr Result<T*> SmallMap<K, T, SmallSz>::at(MaybeView_t<K> const&k) noexcep
 | 
			
		||||
 | 
			
		||||
template<typename K, typename T, size_t SmallSz>
 | 
			
		||||
constexpr Result<const T*> SmallMap<K, T, SmallSz>::at(MaybeView_t<K> const&k) const noexcept {
 | 
			
		||||
	auto p = access(m_pairs, k);
 | 
			
		||||
	bool isNew{};
 | 
			
		||||
	auto p = access(m_pairs, k, isNew);
 | 
			
		||||
	if (!p) {
 | 
			
		||||
		return {nullptr, ox::Error(1, "value not found for given key")};
 | 
			
		||||
	}
 | 
			
		||||
@@ -168,7 +170,8 @@ constexpr void SmallMap<K, T, SmallSz>::erase(MaybeView_t<K> const&k) {
 | 
			
		||||
 | 
			
		||||
template<typename K, typename T, size_t SmallSz>
 | 
			
		||||
constexpr bool SmallMap<K, T, SmallSz>::contains(MaybeView_t<K> const&k) const noexcept {
 | 
			
		||||
	return access(m_pairs, k) != nullptr;
 | 
			
		||||
	bool isNew{};
 | 
			
		||||
	return access(m_pairs, k, isNew) != nullptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename K, typename T, size_t SmallSz>
 | 
			
		||||
@@ -218,30 +221,30 @@ constexpr void SmallMap<K, T, SmallSz>::clear() {
 | 
			
		||||
 | 
			
		||||
template<typename K, typename T, size_t SmallSz>
 | 
			
		||||
template<typename KK>
 | 
			
		||||
constexpr typename SmallMap<K, T, SmallSz>::Pair const&SmallMap<K, T, SmallSz>::access(
 | 
			
		||||
constexpr typename SmallMap<K, T, SmallSz>::Pair const*SmallMap<K, T, SmallSz>::access(
 | 
			
		||||
		PairVector const&pairs, KK const&k, bool &isNew) const {
 | 
			
		||||
	for (auto const&p : pairs) {
 | 
			
		||||
		if (p.key == k) {
 | 
			
		||||
			isNew = false;
 | 
			
		||||
			return p;
 | 
			
		||||
			return &p;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	isNew = true;
 | 
			
		||||
	return pairs.emplace_back();
 | 
			
		||||
	return nullptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename K, typename T, size_t SmallSz>
 | 
			
		||||
template<typename KK>
 | 
			
		||||
constexpr typename SmallMap<K, T, SmallSz>::Pair &SmallMap<K, T, SmallSz>::access(
 | 
			
		||||
constexpr typename SmallMap<K, T, SmallSz>::Pair *SmallMap<K, T, SmallSz>::access(
 | 
			
		||||
		PairVector &pairs, KK const&k, bool &isNew) {
 | 
			
		||||
	for (auto &p : pairs) {
 | 
			
		||||
		if (p.key == k) {
 | 
			
		||||
			isNew = false;
 | 
			
		||||
			return p;
 | 
			
		||||
			return &p;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	isNew = true;
 | 
			
		||||
	return pairs.emplace_back();
 | 
			
		||||
	return &pairs.emplace_back();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename T, typename K, typename V, size_t SmallSz>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								deps/ox/src/ox/std/test/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								deps/ox/src/ox/std/test/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							@@ -18,6 +18,7 @@ add_test("[ox/std] SmallMap" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "SmallMap
 | 
			
		||||
add_test("[ox/std] SmallMap2" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "SmallMap2")
 | 
			
		||||
add_test("[ox/std] Vector" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "Vector")
 | 
			
		||||
add_test("[ox/std] Vector::shrink_to_fit" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "Vector::shrink_to_fit")
 | 
			
		||||
add_test("[ox/std] findIdx" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "findIdx")
 | 
			
		||||
add_test("[ox/std] HashMap" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "HashMap")
 | 
			
		||||
add_test("[ox/std] HeapMgr" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest malloc)
 | 
			
		||||
add_test("[ox/std] Serialize-Int" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "Serialize-Int")
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								deps/ox/src/ox/std/test/tests.cpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								deps/ox/src/ox/std/test/tests.cpp
									
									
									
									
										vendored
									
									
								
							@@ -267,6 +267,20 @@ OX_CLANG_NOWARN_END
 | 
			
		||||
			return ox::Error{};
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"findIdx",
 | 
			
		||||
		[] {
 | 
			
		||||
			ox::Vector<ox::IString<8>> const v {"zero", "one", "two", "three", "four"};
 | 
			
		||||
			oxExpect(ox::findIdx(v.begin(), v.end(), "zero").or_value(5), 0u);
 | 
			
		||||
			oxExpect(ox::findIdx(v.begin(), v.end(), "one").or_value(5), 1u);
 | 
			
		||||
			oxExpect(ox::findIdx(v.begin(), v.end(), "two").or_value(5), 2u);
 | 
			
		||||
			oxExpect(ox::findIdx(v.begin(), v.end(), "three").or_value(5), 3u);
 | 
			
		||||
			oxExpect(ox::findIdx(v.begin(), v.end(), "four").or_value(5), 4u);
 | 
			
		||||
			oxExpect(ox::findIdx(v.begin(), v.end(), "five").or_value(5), 5u);
 | 
			
		||||
			oxExpect(ox::findIdx(v.begin(), v.end(), "six").or_value(6), 6u);
 | 
			
		||||
			return ox::Error{};
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"SmallMap",
 | 
			
		||||
		[] {
 | 
			
		||||
@@ -276,7 +290,18 @@ OX_CLANG_NOWARN_END
 | 
			
		||||
			oxExpect(map.size(), 1u);
 | 
			
		||||
			oxExpect(map["aoeu"], "");
 | 
			
		||||
			oxExpect(map.size(), 2u);
 | 
			
		||||
			return ox::Error(0);
 | 
			
		||||
			ox::SmallMap<ox::String, ox::String> cmap;
 | 
			
		||||
			cmap["asdf"] = "aoeu";
 | 
			
		||||
			auto constexpr constTest = [](ox::SmallMap<ox::String, ox::String> const&map) {
 | 
			
		||||
				OX_REQUIRE(asdf, map.at("asdf"));
 | 
			
		||||
				oxExpect(*asdf, "aoeu");
 | 
			
		||||
				oxExpect(map.size(), 1u);
 | 
			
		||||
				auto const aoeu = map.at("aoeu");
 | 
			
		||||
				oxExpect(aoeu.ok(), false);
 | 
			
		||||
				oxExpect(map.size(), 1u);
 | 
			
		||||
				return ox::Error{};
 | 
			
		||||
			};
 | 
			
		||||
			return constTest(cmap);
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user