void ListClass<T>::splice(ContextType ctx, FunctionType, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { validate_argument_count_at_least(argc, 1); auto list = get_internal<T, ListClass<T>>(this_object); size_t size = list->size(); long index = std::min<long>(Value::to_number(ctx, arguments[0]), size); if (index < 0) { index = std::max<long>(size + index, 0); } size_t remove; if (argc < 2) { remove = size - index; } else { remove = std::max<long>(Value::to_number(ctx, arguments[1]), 0); remove = std::min<long>(remove, size - index); } std::vector<ValueType> removed_objects; removed_objects.reserve(remove); NativeAccessor<T> accessor(ctx, list->get_realm(), list->get_object_schema()); for (size_t i = 0; i < remove; i++) { auto realm_object = realm::Object(list->get_realm(), list->get_object_schema(), list->get(index)); removed_objects.push_back(RealmObjectClass<T>::create_instance(ctx, std::move(realm_object))); list->remove(index); } for (size_t i = 2; i < argc; i++) { list->insert(accessor, index + i - 2, arguments[i]); } return_value.set(Object::create_array(ctx, removed_objects)); }
void ListClass<T>::unshift(ContextType ctx, FunctionType, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { validate_argument_count_at_least(argc, 1); auto list = get_internal<T, ListClass<T>>(this_object); NativeAccessor<T> accessor(ctx, list->get_realm(), list->get_object_schema()); for (size_t i = 0; i < argc; i++) { list->insert(accessor, i, arguments[i]); } return_value.set((uint32_t)list->size()); }
std::vector<String<T>> RealmObjectClass<T>::get_property_names(ContextType ctx, ObjectType object) { auto realm_object = get_internal<T, RealmObjectClass<T>>(object); auto &properties = realm_object->get_object_schema().properties; std::vector<String> names; names.reserve(properties.size()); for (auto &prop : properties) { names.push_back(prop.name); } return names; }
void List<T>::shift(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { validate_argument_count(argc, 0); auto list = get_internal<T, ListClass<T>>(this_object); if (list->size() == 0) { list->verify_in_transaction(); return_value.set_undefined(); } else { auto realm_object = realm::Object(list->get_realm(), list->get_object_schema(), list->get(0)); return_value.set(RealmObject<T>::create_instance(ctx, realm_object)); list->remove(0); } }
void ListClass<T>::pop(ContextType ctx, FunctionType, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { validate_argument_count(argc, 0); auto list = get_internal<T, ListClass<T>>(this_object); size_t size = list->size(); if (size == 0) { list->verify_in_transaction(); return_value.set_undefined(); } else { size_t index = size - 1; auto realm_object = realm::Object(list->get_realm(), list->get_object_schema(), list->get(index)); return_value.set(RealmObjectClass<T>::create_instance(ctx, std::move(realm_object))); list->remove(index); } }
void List<T>::get_index(ContextType ctx, ObjectType object, uint32_t index, ReturnValue &return_value) { auto list = get_internal<T, ListClass<T>>(object); auto realm_object = realm::Object(list->get_realm(), list->get_object_schema(), list->get(index)); return_value.set(RealmObject<T>::create_instance(ctx, realm_object)); }
bool ListClass<T>::set_index(ContextType ctx, ObjectType object, uint32_t index, ValueType value) { auto list = get_internal<T, ListClass<T>>(object); NativeAccessor<T> accessor(ctx, list->get_realm(), list->get_object_schema()); list->set(accessor, index, value); return true; }