blob: 5658e8644d218d58a39a62439a606f8ee6f5fcaf [file] [edit]
#ifdef WITH_RIVE_SCRIPTING
// The LuaAtoms name table and lookup, shared by the native runtime and the
// wasm script module build; both install it as the state's useratom callback
// so namecall dispatch and direct field getters agree everywhere.
#include "rive/lua/rive_lua_libs.hpp"
#include <array>
#include <string_view>
using namespace rive;
namespace
{
struct LuaAtomName
{
std::string_view name;
int16_t atom;
};
constexpr LuaAtomName atoms[] = {
{"length", (int16_t)LuaAtoms::length},
{"lengthSquared", (int16_t)LuaAtoms::lengthSquared},
{"normalized", (int16_t)LuaAtoms::normalized},
{"distance", (int16_t)LuaAtoms::distance},
{"distanceSquared", (int16_t)LuaAtoms::distanceSquared},
{"dot", (int16_t)LuaAtoms::dot},
{"lerp", (int16_t)LuaAtoms::lerp},
{"moveTo", (int16_t)LuaAtoms::moveTo},
{"lineTo", (int16_t)LuaAtoms::lineTo},
{"quadTo", (int16_t)LuaAtoms::quadTo},
{"cubicTo", (int16_t)LuaAtoms::cubicTo},
{"close", (int16_t)LuaAtoms::close},
{"type", (int16_t)LuaAtoms::type},
{"reset", (int16_t)LuaAtoms::reset},
{"add", (int16_t)LuaAtoms::add},
{"contours", (int16_t)LuaAtoms::contours},
{"measure", (int16_t)LuaAtoms::measure},
{"invert", (int16_t)LuaAtoms::invert},
{"isIdentity", (int16_t)LuaAtoms::isIdentity},
{"width", (int16_t)LuaAtoms::width},
{"height", (int16_t)LuaAtoms::height},
{"clamp", (int16_t)LuaAtoms::clamp},
{"repeat", (int16_t)LuaAtoms::repeat},
{"mirror", (int16_t)LuaAtoms::mirror},
{"bilinear", (int16_t)LuaAtoms::bilinear},
{"nearest", (int16_t)LuaAtoms::nearest},
{"style", (int16_t)LuaAtoms::style},
{"join", (int16_t)LuaAtoms::join},
{"cap", (int16_t)LuaAtoms::cap},
{"thickness", (int16_t)LuaAtoms::thickness},
{"blendMode", (int16_t)LuaAtoms::blendMode},
{"feather", (int16_t)LuaAtoms::feather},
{"gradient", (int16_t)LuaAtoms::gradient},
{"color", (int16_t)LuaAtoms::color},
{"stroke", (int16_t)LuaAtoms::stroke},
{"fill", (int16_t)LuaAtoms::fill},
{"miter", (int16_t)LuaAtoms::miter},
{"round", (int16_t)LuaAtoms::round},
{"bevel", (int16_t)LuaAtoms::bevel},
{"butt", (int16_t)LuaAtoms::butt},
{"square", (int16_t)LuaAtoms::square},
{"srcOver", (int16_t)LuaAtoms::srcOver},
{"additive", (int16_t)LuaAtoms::additive},
{"screen", (int16_t)LuaAtoms::screen},
{"overlay", (int16_t)LuaAtoms::overlay},
{"darken", (int16_t)LuaAtoms::darken},
{"lighten", (int16_t)LuaAtoms::lighten},
{"colorDodge", (int16_t)LuaAtoms::colorDodge},
{"colorBurn", (int16_t)LuaAtoms::colorBurn},
{"hardLight", (int16_t)LuaAtoms::hardLight},
{"softLight", (int16_t)LuaAtoms::softLight},
{"difference", (int16_t)LuaAtoms::difference},
{"exclusion", (int16_t)LuaAtoms::exclusion},
{"multiply", (int16_t)LuaAtoms::multiply},
{"hue", (int16_t)LuaAtoms::hue},
{"saturation", (int16_t)LuaAtoms::saturation},
{"luminosity", (int16_t)LuaAtoms::luminosity},
{"copy", (int16_t)LuaAtoms::copy},
{"drawPath", (int16_t)LuaAtoms::drawPath},
{"drawImage", (int16_t)LuaAtoms::drawImage},
{"drawImageMesh", (int16_t)LuaAtoms::drawImageMesh},
{"drawImageMeshInstanced", (int16_t)LuaAtoms::drawImageMeshInstanced},
{"clipPath", (int16_t)LuaAtoms::clipPath},
{"save", (int16_t)LuaAtoms::save},
{"restore", (int16_t)LuaAtoms::restore},
{"transform", (int16_t)LuaAtoms::transform},
{"value", (int16_t)LuaAtoms::value},
{"red", (int16_t)LuaAtoms::red},
{"green", (int16_t)LuaAtoms::green},
{"blue", (int16_t)LuaAtoms::blue},
{"alpha", (int16_t)LuaAtoms::alpha},
{"getNumber", (int16_t)LuaAtoms::getNumber},
{"getTrigger", (int16_t)LuaAtoms::getTrigger},
{"getString", (int16_t)LuaAtoms::getString},
{"getBoolean", (int16_t)LuaAtoms::getBoolean},
{"getColor", (int16_t)LuaAtoms::getColor},
{"getList", (int16_t)LuaAtoms::getList},
{"getViewModel", (int16_t)LuaAtoms::getViewModel},
{"getEnum", (int16_t)LuaAtoms::getEnum},
{"getIndex", (int16_t)LuaAtoms::getIndex},
{"getImage", (int16_t)LuaAtoms::getImage},
{"getFont", (int16_t)LuaAtoms::getFont},
{"getBlob", (int16_t)LuaAtoms::getBlob},
{"values", (int16_t)LuaAtoms::values},
{"addListener", (int16_t)LuaAtoms::addListener},
{"removeListener", (int16_t)LuaAtoms::removeListener},
{"fire", (int16_t)LuaAtoms::fire},
{"push", (int16_t)LuaAtoms::push},
{"insert", (int16_t)LuaAtoms::insert},
{"pop", (int16_t)LuaAtoms::pop},
{"swap", (int16_t)LuaAtoms::swap},
{"shift", (int16_t)LuaAtoms::shift},
{"clear", (int16_t)LuaAtoms::clear},
{"draw", (int16_t)LuaAtoms::draw},
{"modulateOpacity", (int16_t)LuaAtoms::modulateOpacity},
{"advance", (int16_t)LuaAtoms::advance},
{"frameOrigin", (int16_t)LuaAtoms::frameOrigin},
{"data", (int16_t)LuaAtoms::data},
{"instance", (int16_t)LuaAtoms::instance},
{"animation", (int16_t)LuaAtoms::animation},
{"new", (int16_t)LuaAtoms::newAtom},
{"bounds", (int16_t)LuaAtoms::bounds},
{"pointerDown", (int16_t)LuaAtoms::pointerDown},
{"pointerUp", (int16_t)LuaAtoms::pointerUp},
{"pointerMove", (int16_t)LuaAtoms::pointerMove},
{"pointerExit", (int16_t)LuaAtoms::pointerExit},
{"isNumber", (int16_t)LuaAtoms::isNumber},
{"isString", (int16_t)LuaAtoms::isString},
{"isBoolean", (int16_t)LuaAtoms::isBoolean},
{"isColor", (int16_t)LuaAtoms::isColor},
{"hit", (int16_t)LuaAtoms::hit},
{"id", (int16_t)LuaAtoms::id},
{"position", (int16_t)LuaAtoms::position},
{"rotation", (int16_t)LuaAtoms::rotation},
{"scale", (int16_t)LuaAtoms::scale},
{"worldTransform", (int16_t)LuaAtoms::worldTransform},
{"scaleX", (int16_t)LuaAtoms::scaleX},
{"scaleY", (int16_t)LuaAtoms::scaleY},
{"decompose", (int16_t)LuaAtoms::decompose},
{"children", (int16_t)LuaAtoms::children},
{"parent", (int16_t)LuaAtoms::parent},
{"node", (int16_t)LuaAtoms::node},
{"paint", (int16_t)LuaAtoms::paint},
{"asPath", (int16_t)LuaAtoms::asPath},
{"asPaint", (int16_t)LuaAtoms::asPaint},
{"addToPath", (int16_t)LuaAtoms::addToPath},
{"positionAndTangent", (int16_t)LuaAtoms::positionAndTangent},
{"warp", (int16_t)LuaAtoms::warp},
{"extract", (int16_t)LuaAtoms::extract},
{"next", (int16_t)LuaAtoms::next},
{"isClosed", (int16_t)LuaAtoms::isClosed},
{"markNeedsUpdate", (int16_t)LuaAtoms::markNeedsUpdate},
{"viewModel", (int16_t)LuaAtoms::viewModel},
{"rootViewModel", (int16_t)LuaAtoms::rootViewModel},
{"globalViewModel", (int16_t)LuaAtoms::globalViewModel},
{"globalViewModelNames", (int16_t)LuaAtoms::globalViewModelNames},
{"dataContext", (int16_t)LuaAtoms::dataContext},
{"image", (int16_t)LuaAtoms::image},
{"blob", (int16_t)LuaAtoms::blob},
{"size", (int16_t)LuaAtoms::size},
{"name", (int16_t)LuaAtoms::name},
{"duration", (int16_t)LuaAtoms::duration},
{"setTime", (int16_t)LuaAtoms::setTime},
{"setTimeFrames", (int16_t)LuaAtoms::setTimeFrames},
{"setTimePercentage", (int16_t)LuaAtoms::setTimePercentage},
{"isPointerEvent", (int16_t)LuaAtoms::isPointerEvent},
{"isKeyboardEvent", (int16_t)LuaAtoms::isKeyboardEvent},
{"isTextInput", (int16_t)LuaAtoms::isTextInput},
{"previousPosition", (int16_t)LuaAtoms::previousPosition},
{"timeStamp", (int16_t)LuaAtoms::timeStamp},
{"isFocus", (int16_t)LuaAtoms::isFocus},
{"isReportedEvent", (int16_t)LuaAtoms::isReportedEvent},
{"isViewModelChange", (int16_t)LuaAtoms::isViewModelChange},
{"isNone", (int16_t)LuaAtoms::isNone},
{"isGamepadConnected", (int16_t)LuaAtoms::isGamepadConnected},
{"isGamepadEvent", (int16_t)LuaAtoms::isGamepadEvent},
{"isGamepadDisconnected", (int16_t)LuaAtoms::isGamepadDisconnected},
{"asPointerEvent", (int16_t)LuaAtoms::asPointerEvent},
{"asKeyboardEvent", (int16_t)LuaAtoms::asKeyboardEvent},
{"asTextInput", (int16_t)LuaAtoms::asTextInput},
{"asFocus", (int16_t)LuaAtoms::asFocus},
{"asReportedEvent", (int16_t)LuaAtoms::asReportedEvent},
{"asViewModelChange", (int16_t)LuaAtoms::asViewModelChange},
{"asGamepadConnected", (int16_t)LuaAtoms::asGamepadConnected},
{"asGamepadEvent", (int16_t)LuaAtoms::asGamepadEvent},
{"asGamepadDisconnected", (int16_t)LuaAtoms::asGamepadDisconnected},
{"gamepadEvent", (int16_t)LuaAtoms::gamepadEvent},
{"gamepadConnected", (int16_t)LuaAtoms::gamepadConnected},
{"gamepadDisconnected", (int16_t)LuaAtoms::gamepadDisconnected},
{"asNone", (int16_t)LuaAtoms::asNone},
{"key", (int16_t)LuaAtoms::key},
{"shift", (int16_t)LuaAtoms::shift},
{"alt", (int16_t)LuaAtoms::alt},
{"control", (int16_t)LuaAtoms::control},
{"meta", (int16_t)LuaAtoms::meta},
{"text", (int16_t)LuaAtoms::text},
{"phase", (int16_t)LuaAtoms::phase},
{"delaySeconds", (int16_t)LuaAtoms::delaySeconds},
{"deviceId", (int16_t)LuaAtoms::deviceId},
{"buttonMask", (int16_t)LuaAtoms::buttonMask},
{"remove", (int16_t)LuaAtoms::remove},
{"removeAt", (int16_t)LuaAtoms::removeAt},
{"removeAllOf", (int16_t)LuaAtoms::removeAllOf},
{"axes", (int16_t)LuaAtoms::axes},
{"gamepadMapping", (int16_t)LuaAtoms::gamepadMapping},
{"mapping", (int16_t)LuaAtoms::mapping},
{"isStandardMapping", (int16_t)LuaAtoms::isStandardMapping},
{"buttons", (int16_t)LuaAtoms::buttons},
{"buttonPressed", (int16_t)LuaAtoms::buttonPressed},
{"buttonValue", (int16_t)LuaAtoms::buttonValue},
{"axis", (int16_t)LuaAtoms::axis},
{"west", (int16_t)LuaAtoms::west},
{"south", (int16_t)LuaAtoms::south},
{"north", (int16_t)LuaAtoms::north},
{"east", (int16_t)LuaAtoms::east},
{"leftShoulder", (int16_t)LuaAtoms::leftShoulder},
{"rightShoulder", (int16_t)LuaAtoms::rightShoulder},
{"back", (int16_t)LuaAtoms::gamepadBack},
{"forward", (int16_t)LuaAtoms::gamepadForward},
{"leftStickButton", (int16_t)LuaAtoms::leftStickButton},
{"rightStickButton", (int16_t)LuaAtoms::rightStickButton},
{"dpadUp", (int16_t)LuaAtoms::dpadUp},
{"dpadDown", (int16_t)LuaAtoms::dpadDown},
{"dpadLeft", (int16_t)LuaAtoms::dpadLeft},
{"dpadRight", (int16_t)LuaAtoms::dpadRight},
{"start", (int16_t)LuaAtoms::start},
{"leftStick", (int16_t)LuaAtoms::leftStick},
{"rightStick", (int16_t)LuaAtoms::rightStick},
{"leftTrigger", (int16_t)LuaAtoms::leftTrigger},
{"rightTrigger", (int16_t)LuaAtoms::rightTrigger},
{"leftTriggerPressed", (int16_t)LuaAtoms::leftTriggerPressed},
{"rightTriggerPressed", (int16_t)LuaAtoms::rightTriggerPressed},
{"changeKind", (int16_t)LuaAtoms::changeKind},
{"changeIndex", (int16_t)LuaAtoms::changeIndex},
{"changeValue", (int16_t)LuaAtoms::changeValue},
{"hasStandardButtonIntent", (int16_t)LuaAtoms::hasStandardButtonIntent},
{"hasStandardAxisIntent", (int16_t)LuaAtoms::hasStandardAxisIntent},
{"intentButton", (int16_t)LuaAtoms::intentButton},
{"intentAxis", (int16_t)LuaAtoms::intentAxis},
{"audio", (int16_t)LuaAtoms::audio},
{"play", (int16_t)LuaAtoms::play},
{"playAtTime", (int16_t)LuaAtoms::playAtTime},
{"playInTime", (int16_t)LuaAtoms::playInTime},
{"playAtFrame", (int16_t)LuaAtoms::playAtFrame},
{"playInFrame", (int16_t)LuaAtoms::playInFrame},
{"stop", (int16_t)LuaAtoms::stop},
{"pause", (int16_t)LuaAtoms::pause},
{"resume", (int16_t)LuaAtoms::resume},
{"seek", (int16_t)LuaAtoms::seek},
{"seekFrame", (int16_t)LuaAtoms::seekFrame},
{"volume", (int16_t)LuaAtoms::volume},
{"completed", (int16_t)LuaAtoms::completed},
{"time", (int16_t)LuaAtoms::time},
{"timeFrame", (int16_t)LuaAtoms::timeFrame},
{"sampleRate", (int16_t)LuaAtoms::sampleRate},
// GPU
{"write", (int16_t)LuaAtoms::write},
{"upload", (int16_t)LuaAtoms::upload},
{"view", (int16_t)LuaAtoms::view},
{"setPipeline", (int16_t)LuaAtoms::setPipeline},
{"setVertexBuffer", (int16_t)LuaAtoms::setVertexBuffer},
{"setIndexBuffer", (int16_t)LuaAtoms::setIndexBuffer},
{"setBindGroup", (int16_t)LuaAtoms::setBindGroup},
{"setViewport", (int16_t)LuaAtoms::setViewport},
{"setScissorRect", (int16_t)LuaAtoms::setScissorRect},
{"setStencilReference", (int16_t)LuaAtoms::setStencilReference},
{"drawIndexed", (int16_t)LuaAtoms::drawIndexed},
{"finish", (int16_t)LuaAtoms::finish},
{"beginRenderPass", (int16_t)LuaAtoms::beginRenderPass},
{"beginFrame", (int16_t)LuaAtoms::beginFrame},
{"endFrame", (int16_t)LuaAtoms::endFrame},
{"colorView", (int16_t)LuaAtoms::colorView},
{"depthView", (int16_t)LuaAtoms::depthView},
{"setBlendColor", (int16_t)LuaAtoms::setBlendColor},
{"resize", (int16_t)LuaAtoms::resize},
{"set", (int16_t)LuaAtoms::set},
{"canvas", (int16_t)LuaAtoms::canvas},
{"gpuCanvas", (int16_t)LuaAtoms::gpuCanvas},
{"features", (int16_t)LuaAtoms::features},
{"shader", (int16_t)LuaAtoms::shader},
{"format", (int16_t)LuaAtoms::format},
{"gpuTarget", (int16_t)LuaAtoms::gpuTarget},
{"sampleCount", (int16_t)LuaAtoms::sampleCount},
{"andThen", (int16_t)LuaAtoms::andThen},
{"catch", (int16_t)LuaAtoms::catch_},
{"finally", (int16_t)LuaAtoms::finally_},
{"cancel", (int16_t)LuaAtoms::cancel},
{"onCancel", (int16_t)LuaAtoms::onCancel},
{"getStatus", (int16_t)LuaAtoms::getStatus},
{"decodeImage", (int16_t)LuaAtoms::decodeImage},
// Mat4
{"transpose", (int16_t)LuaAtoms::transpose},
{"transformPoint", (int16_t)LuaAtoms::transformPoint},
{"transformVec4", (int16_t)LuaAtoms::transformVec4},
{"writeToBuffer", (int16_t)LuaAtoms::writeToBuffer},
{"invertAffine", (int16_t)LuaAtoms::invertAffine},
// Vector
{"writeVec4", (int16_t)LuaAtoms::writeVec4},
// Drawable
{"modulateColor", (int16_t)LuaAtoms::modulateColor},
{"setColorModulation", (int16_t)LuaAtoms::setColorModulation},
{"propertyKey", (int16_t)LuaAtoms::propertyKey},
{"drawModulated", (int16_t)LuaAtoms::drawModulated},
{"number", (int16_t)LuaAtoms::number},
{"boolean", (int16_t)LuaAtoms::boolean},
{"string", (int16_t)LuaAtoms::string},
#ifdef WITH_RIVE_TOOLS
{"properties", (int16_t)LuaAtoms::properties},
#endif
{"append", (int16_t)LuaAtoms::append},
{"line", (int16_t)LuaAtoms::line},
{"lines", (int16_t)LuaAtoms::lines},
{"hitTest", (int16_t)LuaAtoms::hitTest},
{"caret", (int16_t)LuaAtoms::caret},
{"selectionRects", (int16_t)LuaAtoms::selectionRects},
{"glyph", (int16_t)LuaAtoms::glyph},
{"glyphs", (int16_t)LuaAtoms::glyphs},
{"path", (int16_t)LuaAtoms::path},
{"glyphPath", (int16_t)LuaAtoms::glyphPath},
{"withOptions", (int16_t)LuaAtoms::withOptions},
{"hasGlyph", (int16_t)LuaAtoms::hasGlyph},
{"axisValue", (int16_t)LuaAtoms::axisValue},
{"lineHeight", (int16_t)LuaAtoms::lineHeight},
{"decode", (int16_t)LuaAtoms::decode},
{"font", (int16_t)LuaAtoms::font},
{"ascent", (int16_t)LuaAtoms::ascent},
{"descent", (int16_t)LuaAtoms::descent},
{"capHeight", (int16_t)LuaAtoms::capHeight},
{"xHeight", (int16_t)LuaAtoms::xHeight},
{"weight", (int16_t)LuaAtoms::weight},
{"isItalic", (int16_t)LuaAtoms::isItalic},
{"sizing", (int16_t)LuaAtoms::sizing},
{"overflow", (int16_t)LuaAtoms::overflow},
{"align", (int16_t)LuaAtoms::align},
{"wrap", (int16_t)LuaAtoms::wrap},
{"wordBreak", (int16_t)LuaAtoms::wordBreak},
{"origin", (int16_t)LuaAtoms::origin},
{"direction", (int16_t)LuaAtoms::direction},
{"maxWidth", (int16_t)LuaAtoms::maxWidth},
{"maxHeight", (int16_t)LuaAtoms::maxHeight},
{"paragraphSpacing", (int16_t)LuaAtoms::paragraphSpacing},
{"lineCount", (int16_t)LuaAtoms::lineCount},
{"glyphCount", (int16_t)LuaAtoms::glyphCount},
{"baseline", (int16_t)LuaAtoms::baseline},
{"bottom", (int16_t)LuaAtoms::bottom},
{"top", (int16_t)LuaAtoms::top},
{"textIndex", (int16_t)LuaAtoms::textIndex},
{"firstIndex", (int16_t)LuaAtoms::firstIndex},
{"lastIndex", (int16_t)LuaAtoms::lastIndex},
{"x", (int16_t)LuaAtoms::x},
{"y", (int16_t)LuaAtoms::y},
{"isEmpty", (int16_t)LuaAtoms::isEmpty},
{"index", (int16_t)LuaAtoms::index},
{"ltr", (int16_t)LuaAtoms::ltr},
{"rtl", (int16_t)LuaAtoms::rtl},
{"auto", (int16_t)LuaAtoms::autoDetect},
{"left", (int16_t)LuaAtoms::left},
{"right", (int16_t)LuaAtoms::right},
{"center", (int16_t)LuaAtoms::center},
{"end", (int16_t)LuaAtoms::end},
{"autoWidth", (int16_t)LuaAtoms::autoWidth},
{"autoHeight", (int16_t)LuaAtoms::autoHeight},
{"fixed", (int16_t)LuaAtoms::fixed},
{"visible", (int16_t)LuaAtoms::visible},
{"hidden", (int16_t)LuaAtoms::hidden},
{"clipped", (int16_t)LuaAtoms::clipped},
{"ellipsis", (int16_t)LuaAtoms::ellipsis},
{"noWrap", (int16_t)LuaAtoms::noWrap},
{"breakWord", (int16_t)LuaAtoms::breakWord},
{"normal", (int16_t)LuaAtoms::normal},
{"breakAll", (int16_t)LuaAtoms::breakAll},
{"letterSpacing", (int16_t)LuaAtoms::letterSpacing},
{"foregroundColor", (int16_t)LuaAtoms::foregroundColor},
{"min", (int16_t)LuaAtoms::min},
{"max", (int16_t)LuaAtoms::max},
{"default", (int16_t)LuaAtoms::defaultValue},
};
constexpr size_t atomCount = std::size(atoms);
// Power of two so the modulo is a mask, and roomy enough to keep probes short.
constexpr bool hasAtom(LuaAtoms atom)
{
for (const LuaAtomName& row : atoms)
{
if (row.atom == (int16_t)atom)
{
return true;
}
}
return false;
}
constexpr bool hasAtomRange(LuaAtoms first, LuaAtoms last)
{
for (int16_t atom = (int16_t)first; atom <= (int16_t)last; atom++)
{
if (!hasAtom((LuaAtoms)atom))
{
return false;
}
}
return true;
}
// The text atoms follow the tools only ones; a guard swallowing them only
// shows in a runtime build, which the test binaries never are.
static_assert(hasAtomRange(LuaAtoms::append, LuaAtoms::defaultValue),
"text atoms must register in every build");
constexpr size_t atomSlotCount = 1024;
static_assert(atomCount < atomSlotCount,
"atomSlotCount must exceed the number of atoms");
constexpr uint32_t hashAtomName(std::string_view name)
{
uint32_t hash = 2166136261u;
for (char c : name)
{
hash = (hash ^ (uint8_t)c) * 16777619u;
}
return hash;
}
constexpr size_t longestAtomName()
{
size_t longest = 0;
for (const LuaAtomName& entry : atoms)
{
if (entry.name.size() > longest)
{
longest = entry.name.size();
}
}
return longest;
}
constexpr size_t maxAtomNameLength = longestAtomName();
// Slots hold an index into atoms biased by one so zero reads as empty.
constexpr std::array<uint16_t, atomSlotCount> buildAtomSlots()
{
std::array<uint16_t, atomSlotCount> slots{};
for (size_t i = 0; i < atomCount; i++)
{
size_t slot = hashAtomName(atoms[i].name) & (atomSlotCount - 1);
while (slots[slot] != 0 && atoms[slots[slot] - 1].name != atoms[i].name)
{
slot = (slot + 1) & (atomSlotCount - 1);
}
if (slots[slot] == 0)
{
slots[slot] = (uint16_t)(i + 1);
}
}
return slots;
}
constexpr std::array<uint16_t, atomSlotCount> atomSlots = buildAtomSlots();
int16_t findAtom(const char* chars, size_t length)
{
if (length > maxAtomNameLength)
{
return -1;
}
std::string_view name(chars, length);
size_t slot = hashAtomName(name) & (atomSlotCount - 1);
for (uint16_t index = atomSlots[slot]; index != 0;
index = atomSlots[slot = (slot + 1) & (atomSlotCount - 1)])
{
if (atoms[index - 1].name == name)
{
return atoms[index - 1].atom;
}
}
return -1;
}
} // namespace
namespace rive
{
int16_t rive_lua_findAtom(const char* chars, size_t length)
{
return findAtom(chars, length);
}
} // namespace rive
#endif