mirror of
https://github.com/ChaiScript/ChaiScript.git
synced 2026-04-30 19:09:26 +08:00
Add a native find() method to unique associative containers (e.g., Map) that returns the mapped value if the key exists, or an undefined Boxed_Value if not. This allows checking for key existence without mutating the container (unlike operator[]) or requiring exception handling (unlike at()). Co-authored-by: leftibot <leftibot@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
0d1ceed05d
commit
dcdab50efd
@ -85,6 +85,15 @@ namespace chaiscript::bootstrap::standard_library {
|
|||||||
return t_target.count(t_key);
|
return t_target.count(t_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
Boxed_Value find(const T &t_target, const typename T::key_type &t_key) {
|
||||||
|
const auto itr = t_target.find(t_key);
|
||||||
|
if (itr != t_target.end()) {
|
||||||
|
return Boxed_Value(itr->second);
|
||||||
|
}
|
||||||
|
return Boxed_Value();
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void insert(T &t_target, const T &t_other) {
|
void insert(T &t_target, const T &t_other) {
|
||||||
t_target.insert(t_other.begin(), t_other.end());
|
t_target.insert(t_other.begin(), t_other.end());
|
||||||
@ -355,6 +364,7 @@ namespace chaiscript::bootstrap::standard_library {
|
|||||||
template<typename ContainerType>
|
template<typename ContainerType>
|
||||||
void unique_associative_container_type(const std::string & /*type*/, Module &m) {
|
void unique_associative_container_type(const std::string & /*type*/, Module &m) {
|
||||||
m.add(fun(detail::count<ContainerType>), "count");
|
m.add(fun(detail::count<ContainerType>), "count");
|
||||||
|
m.add(fun(detail::find<ContainerType>), "find");
|
||||||
|
|
||||||
using erase_ptr = size_t (ContainerType::*)(const typename ContainerType::key_type &);
|
using erase_ptr = size_t (ContainerType::*)(const typename ContainerType::key_type &);
|
||||||
|
|
||||||
|
|||||||
15
unittests/map_find.chai
Normal file
15
unittests/map_find.chai
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
auto m = ["k":"v"]
|
||||||
|
|
||||||
|
// find existing key returns the value
|
||||||
|
assert_equal("v", m.find("k"))
|
||||||
|
|
||||||
|
// find missing key returns undef
|
||||||
|
assert_true(m.find("missing").is_var_undef())
|
||||||
|
|
||||||
|
// find does not mutate the map
|
||||||
|
m.find("other")
|
||||||
|
assert_equal(1, m.size())
|
||||||
|
|
||||||
|
// find works with in-place map
|
||||||
|
assert_equal("v", ["k":"v"].find("k"))
|
||||||
Loading…
x
Reference in New Issue
Block a user