0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-07-01 08:18:20 +02:00

ircd::js: Improve for_each().

This commit is contained in:
Jason Volk 2016-11-24 18:27:40 -08:00
parent 4edfd51106
commit f2a395b879
2 changed files with 87 additions and 41 deletions

View file

@ -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

View file

@ -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