mirror of
https://github.com/matrix-construct/construct
synced 2024-10-01 21:28:53 +02:00
ircd::js: Improve for_each().
This commit is contained in:
parent
4edfd51106
commit
f2a395b879
2 changed files with 87 additions and 41 deletions
|
@ -25,50 +25,32 @@
|
||||||
namespace ircd {
|
namespace ircd {
|
||||||
namespace js {
|
namespace js {
|
||||||
|
|
||||||
using closure_id = std::function<void (const id &)>;
|
enum class iter
|
||||||
using closure_key_val = std::function<void (const value &, const value &)>;
|
|
||||||
using closure_mutable_key_val = std::function<void (const value &, value &)>;
|
|
||||||
|
|
||||||
void for_each(object::handle, const closure_id &);
|
|
||||||
void for_each(object::handle, const closure_key_val &);
|
|
||||||
void for_each(object::handle_mutable, const closure_mutable_key_val &);
|
|
||||||
|
|
||||||
|
|
||||||
inline void
|
|
||||||
for_each(object::handle_mutable obj,
|
|
||||||
const closure_mutable_key_val &closure)
|
|
||||||
{
|
{
|
||||||
for_each(obj, [&obj, &closure]
|
none = 0,
|
||||||
(const id &hid)
|
enumerate = JSITER_ENUMERATE,
|
||||||
{
|
for_each = JSITER_FOREACH,
|
||||||
value val(get(obj, hid));
|
key_val = JSITER_KEYVALUE,
|
||||||
const value key(hid);
|
own_only = JSITER_OWNONLY,
|
||||||
closure(key, val);
|
hidden = JSITER_HIDDEN,
|
||||||
});
|
symbols = JSITER_SYMBOLS,
|
||||||
}
|
symbols_only = JSITER_SYMBOLSONLY,
|
||||||
|
};
|
||||||
|
|
||||||
inline void
|
// Key iteration (as id type)
|
||||||
for_each(object::handle obj,
|
using each_id = std::function<void (const id &)>;
|
||||||
const closure_key_val &closure)
|
void for_each(object::handle, const iter &flags, const each_id &);
|
||||||
{
|
void for_each(object::handle, const each_id &);
|
||||||
for_each(obj, [&obj, &closure]
|
|
||||||
(const id &hid)
|
|
||||||
{
|
|
||||||
const value val(get(obj, hid));
|
|
||||||
const value key(hid);
|
|
||||||
closure(key, val);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void
|
// Key iteration (as value)
|
||||||
for_each(object::handle obj,
|
using each_key = std::function<void (const value &)>;
|
||||||
const closure_id &closure)
|
void for_each(object::handle, const each_key &);
|
||||||
{
|
void for_each(object::handle, const iter &flags, const each_key &);
|
||||||
JS::Rooted<JS::IdVector> props(*cx, JS::IdVector(cx->ptr()));
|
|
||||||
if(JS_Enumerate(*cx, obj, &props))
|
// Key/Value iteration (as value => value)
|
||||||
for(size_t i(0); i < props.length(); ++i)
|
using each_key_val = std::function<void (const value &, const value &)>;
|
||||||
closure(props[i]);
|
void for_each(object::handle, const each_key_val &);
|
||||||
}
|
void for_each(object::handle, const iter &flags, const each_key_val &);
|
||||||
|
|
||||||
} // namespace js
|
} // namespace js
|
||||||
} // namespace ircd
|
} // namespace ircd
|
||||||
|
|
64
ircd/js.cc
64
ircd/js.cc
|
@ -1328,6 +1328,70 @@ noexcept
|
||||||
// ircd/js/function.h
|
// ircd/js/function.h
|
||||||
//
|
//
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// ircd/js/for_each.h
|
||||||
|
//
|
||||||
|
|
||||||
|
void
|
||||||
|
ircd::js::for_each(object::handle obj,
|
||||||
|
const each_key_val &closure)
|
||||||
|
{
|
||||||
|
for_each(obj, iter::none, closure);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ircd::js::for_each(object::handle obj,
|
||||||
|
const iter &flags,
|
||||||
|
const each_key_val &closure)
|
||||||
|
{
|
||||||
|
for_each(obj, flags, each_id([&obj, &closure]
|
||||||
|
(const id &hid)
|
||||||
|
{
|
||||||
|
const value val(get(obj, hid));
|
||||||
|
const value key(hid);
|
||||||
|
closure(key, val);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ircd::js::for_each(object::handle obj,
|
||||||
|
const each_key &closure)
|
||||||
|
{
|
||||||
|
for_each(obj, iter::none, closure);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ircd::js::for_each(object::handle obj,
|
||||||
|
const iter &flags,
|
||||||
|
const each_key &closure)
|
||||||
|
{
|
||||||
|
for_each(obj, flags, each_id([&obj, &closure]
|
||||||
|
(const id &id)
|
||||||
|
{
|
||||||
|
const value key(id);
|
||||||
|
closure(key);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ircd::js::for_each(object::handle obj,
|
||||||
|
const each_id &closure)
|
||||||
|
{
|
||||||
|
for_each(obj, iter::none, closure);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ircd::js::for_each(object::handle obj,
|
||||||
|
const iter &flags,
|
||||||
|
const each_id &closure)
|
||||||
|
{
|
||||||
|
vector<id> props;
|
||||||
|
if(::js::GetPropertyKeys(*cx, obj, uint(flags), &props))
|
||||||
|
for(size_t i(0); i < props.length(); ++i)
|
||||||
|
closure(props[i]);
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// ircd/js/call.h
|
// ircd/js/call.h
|
||||||
|
|
Loading…
Reference in a new issue