mirror of
https://github.com/matrix-construct/construct
synced 2024-09-30 04:38:52 +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 js {
|
||||
|
||||
using closure_id = std::function<void (const id &)>;
|
||||
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)
|
||||
enum class iter
|
||||
{
|
||||
for_each(obj, [&obj, &closure]
|
||||
(const id &hid)
|
||||
{
|
||||
value val(get(obj, hid));
|
||||
const value key(hid);
|
||||
closure(key, val);
|
||||
});
|
||||
}
|
||||
none = 0,
|
||||
enumerate = JSITER_ENUMERATE,
|
||||
for_each = JSITER_FOREACH,
|
||||
key_val = JSITER_KEYVALUE,
|
||||
own_only = JSITER_OWNONLY,
|
||||
hidden = JSITER_HIDDEN,
|
||||
symbols = JSITER_SYMBOLS,
|
||||
symbols_only = JSITER_SYMBOLSONLY,
|
||||
};
|
||||
|
||||
inline void
|
||||
for_each(object::handle obj,
|
||||
const closure_key_val &closure)
|
||||
{
|
||||
for_each(obj, [&obj, &closure]
|
||||
(const id &hid)
|
||||
{
|
||||
const value val(get(obj, hid));
|
||||
const value key(hid);
|
||||
closure(key, val);
|
||||
});
|
||||
}
|
||||
// Key iteration (as id type)
|
||||
using each_id = std::function<void (const id &)>;
|
||||
void for_each(object::handle, const iter &flags, const each_id &);
|
||||
void for_each(object::handle, const each_id &);
|
||||
|
||||
inline void
|
||||
for_each(object::handle obj,
|
||||
const closure_id &closure)
|
||||
{
|
||||
JS::Rooted<JS::IdVector> props(*cx, JS::IdVector(cx->ptr()));
|
||||
if(JS_Enumerate(*cx, obj, &props))
|
||||
for(size_t i(0); i < props.length(); ++i)
|
||||
closure(props[i]);
|
||||
}
|
||||
// Key iteration (as value)
|
||||
using each_key = std::function<void (const value &)>;
|
||||
void for_each(object::handle, const each_key &);
|
||||
void for_each(object::handle, const iter &flags, const each_key &);
|
||||
|
||||
// Key/Value iteration (as value => value)
|
||||
using each_key_val = std::function<void (const value &, const value &)>;
|
||||
void for_each(object::handle, const each_key_val &);
|
||||
void for_each(object::handle, const iter &flags, const each_key_val &);
|
||||
|
||||
} // namespace js
|
||||
} // namespace ircd
|
||||
|
|
64
ircd/js.cc
64
ircd/js.cc
|
@ -1328,6 +1328,70 @@ noexcept
|
|||
// 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
|
||||
|
|
Loading…
Reference in a new issue