refactor list

This commit is contained in:
Ari Lazier 2016-03-25 12:13:49 -07:00
parent d62f78050e
commit 20bac8e2c7
1 changed files with 82 additions and 59 deletions

View File

@ -31,6 +31,26 @@
using RJSAccessor = realm::NativeAccessor<JSValueRef, JSContextRef>; using RJSAccessor = realm::NativeAccessor<JSValueRef, JSContextRef>;
using namespace realm; using namespace realm;
void RJSSetReturnUndefined(JSContextRef ctx, JSValueRef &returnObject) {
returnObject = JSValueMakeUndefined(ctx);
}
template<typename T>
void RJSSetReturnNumber(JSContextRef ctx, JSValueRef &returnObject, T number) {
returnObject = JSValueMakeNumber(ctx, number);
}
void RJSSetReturnArray(JSContextRef ctx, size_t count, const JSValueRef *objects, JSValueRef &returnObject) {
returnObject = JSObjectMakeArray(ctx, count, objects, NULL);
}
void RJSSetException(JSContextRef ctx, JSValueRef * &exceptionObject, std::exception &exception) {
if (exceptionObject) {
*exceptionObject = RJSMakeError(ctx, exception);
}
}
JSValueRef ListGetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* jsException) { JSValueRef ListGetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* jsException) {
try { try {
List *list = RJSGetInternal<List *>(object); List *list = RJSGetInternal<List *>(object);
@ -93,24 +113,23 @@ void ListPropertyNames(JSContextRef ctx, JSObjectRef object, JSPropertyNameAccum
} }
} }
JSValueRef ListPush(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* jsException) { template<typename ContextType, typename ThisType, typename ArgumentsType, typename ReturnType, typename ExceptionType>
void ListPush(ContextType ctx, ThisType thisObject, size_t argumentCount, const ArgumentsType &arguments, ReturnType &returnObject, ExceptionType &exceptionObject) {
try { try {
List *list = RJSGetInternal<List *>(thisObject); List *list = RJSGetInternal<List *>(thisObject);
RJSValidateArgumentCountIsAtLeast(argumentCount, 1); RJSValidateArgumentCountIsAtLeast(argumentCount, 1);
for (size_t i = 0; i < argumentCount; i++) { for (size_t i = 0; i < argumentCount; i++) {
list->add(ctx, arguments[i]); list->add(ctx, arguments[i]);
} }
return JSValueMakeNumber(ctx, list->size()); RJSSetReturnNumber(ctx, returnObject, list->size());
} }
catch (std::exception &exp) { catch (std::exception &exp) {
if (jsException) { RJSSetException(ctx, exceptionObject, exp);
*jsException = RJSMakeError(ctx, exp);
} }
}
return NULL;
} }
JSValueRef ListPop(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* jsException) { template<typename ContextType, typename ThisType, typename ArgumentsType, typename ReturnType, typename ExceptionType>
void ListPop(ContextType ctx, ThisType thisObject, size_t argumentCount, const ArgumentsType &arguments, ReturnType &returnObject, ExceptionType &exceptionObject) {
try { try {
List *list = RJSGetInternal<List *>(thisObject); List *list = RJSGetInternal<List *>(thisObject);
RJSValidateArgumentCount(argumentCount, 0); RJSValidateArgumentCount(argumentCount, 0);
@ -118,59 +137,56 @@ JSValueRef ListPop(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObjec
size_t size = list->size(); size_t size = list->size();
if (size == 0) { if (size == 0) {
list->verify_in_transaction(); list->verify_in_transaction();
return JSValueMakeUndefined(ctx); RJSSetReturnUndefined(ctx, returnObject);
} }
else {
size_t index = size - 1; size_t index = size - 1;
JSValueRef obj = RJSObjectCreate(ctx, Object(list->get_realm(), list->get_object_schema(), list->get(index))); returnObject = RJSObjectCreate(ctx, Object(list->get_realm(), list->get_object_schema(), list->get(index)));
list->remove(index); list->remove(index);
return obj;
}
catch (std::exception &exp) {
if (jsException) {
*jsException = RJSMakeError(ctx, exp);
} }
} }
return NULL; catch (std::exception &exception) {
RJSSetException(ctx, exceptionObject, exception);
}
} }
JSValueRef ListUnshift(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* jsException) {
template<typename ContextType, typename ThisType, typename ArgumentsType, typename ReturnType, typename ExceptionType>
void ListUnshift(ContextType ctx, ThisType thisObject, size_t argumentCount, const ArgumentsType &arguments, ReturnType &returnObject, ExceptionType &exceptionObject) {
try { try {
List *list = RJSGetInternal<List *>(thisObject); List *list = RJSGetInternal<List *>(thisObject);
RJSValidateArgumentCountIsAtLeast(argumentCount, 1); RJSValidateArgumentCountIsAtLeast(argumentCount, 1);
for (size_t i = 0; i < argumentCount; i++) { for (size_t i = 0; i < argumentCount; i++) {
list->insert(ctx, arguments[i], i); list->insert(ctx, arguments[i], i);
} }
return JSValueMakeNumber(ctx, list->size()); RJSSetReturnNumber(ctx, returnObject, list->size());
} }
catch (std::exception &exp) { catch (std::exception &exp) {
if (jsException) { RJSSetException(ctx, exceptionObject, exp);
*jsException = RJSMakeError(ctx, exp);
} }
}
return NULL;
} }
JSValueRef ListShift(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* jsException) { template<typename ContextType, typename ThisType, typename ArgumentsType, typename ReturnType, typename ExceptionType>
void ListShift(ContextType ctx, ThisType thisObject, size_t argumentCount, const ArgumentsType &arguments, ReturnType &returnObject, ExceptionType &exceptionObject) {
try { try {
List *list = RJSGetInternal<List *>(thisObject); List *list = RJSGetInternal<List *>(thisObject);
RJSValidateArgumentCount(argumentCount, 0); RJSValidateArgumentCount(argumentCount, 0);
if (list->size() == 0) { if (list->size() == 0) {
list->verify_in_transaction(); list->verify_in_transaction();
return JSValueMakeUndefined(ctx); RJSSetReturnUndefined(ctx, returnObject);
} }
JSValueRef obj = RJSObjectCreate(ctx, Object(list->get_realm(), list->get_object_schema(), list->get(0))); else {
returnObject = RJSObjectCreate(ctx, Object(list->get_realm(), list->get_object_schema(), list->get(0)));
list->remove(0); list->remove(0);
return obj; }
} }
catch (std::exception &exp) { catch (std::exception &exp) {
if (jsException) { RJSSetException(ctx, exceptionObject, exp);
*jsException = RJSMakeError(ctx, exp);
} }
}
return NULL;
} }
JSValueRef ListSplice(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* jsException) { template<typename ContextType, typename ThisType, typename ArgumentsType, typename ReturnType, typename ExceptionType>
void ListSplice(ContextType ctx, ThisType thisObject, size_t argumentCount, const ArgumentsType &arguments, ReturnType &returnObject, ExceptionType &exceptionObject) {
try { try {
List *list = RJSGetInternal<List *>(thisObject); List *list = RJSGetInternal<List *>(thisObject);
size_t size = list->size(); size_t size = list->size();
@ -190,7 +206,7 @@ JSValueRef ListSplice(JSContextRef ctx, JSObjectRef function, JSObjectRef thisOb
remove = std::min<long>(remove, size - index); remove = std::min<long>(remove, size - index);
} }
std::vector<JSObjectRef> removedObjects(remove); std::vector<ReturnType> removedObjects(remove);
for (size_t i = 0; i < remove; i++) { for (size_t i = 0; i < remove; i++) {
removedObjects[i] = RJSObjectCreate(ctx, Object(list->get_realm(), list->get_object_schema(), list->get(index))); removedObjects[i] = RJSObjectCreate(ctx, Object(list->get_realm(), list->get_object_schema(), list->get(index)));
list->remove(index); list->remove(index);
@ -198,63 +214,70 @@ JSValueRef ListSplice(JSContextRef ctx, JSObjectRef function, JSObjectRef thisOb
for (size_t i = 2; i < argumentCount; i++) { for (size_t i = 2; i < argumentCount; i++) {
list->insert(ctx, arguments[i], index + i - 2); list->insert(ctx, arguments[i], index + i - 2);
} }
return JSObjectMakeArray(ctx, remove, removedObjects.data(), jsException); RJSSetReturnArray(ctx, remove, removedObjects.data(), returnObject);
} }
catch (std::exception &exp) { catch (std::exception &exp) {
if (jsException) { RJSSetException(ctx, exceptionObject, exp);
*jsException = RJSMakeError(ctx, exp);
} }
}
return NULL;
} }
JSValueRef ListStaticResults(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* jsException) {
template<typename ContextType, typename ThisType, typename ArgumentsType, typename ReturnType, typename ExceptionType>
void ListStaticResults(ContextType ctx, ThisType thisObject, size_t argumentCount, const ArgumentsType &arguments, ReturnType &returnObject, ExceptionType &exceptionObject) {
try { try {
List *list = RJSGetInternal<List *>(thisObject); List *list = RJSGetInternal<List *>(thisObject);
RJSValidateArgumentCount(argumentCount, 0); RJSValidateArgumentCount(argumentCount, 0);
returnObject = RJSResultsCreate(ctx, list->get_realm(), list->get_object_schema(), std::move(list->get_query()), false);
return RJSResultsCreate(ctx, list->get_realm(), list->get_object_schema(), std::move(list->get_query()), false);
} }
catch (std::exception &exp) { catch (std::exception &exp) {
if (jsException) { RJSSetException(ctx, exceptionObject, exp);
*jsException = RJSMakeError(ctx, exp);
} }
}
return NULL;
} }
JSValueRef ListFiltered(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* jsException) { template<typename ContextType, typename ThisType, typename ArgumentsType, typename ReturnType, typename ExceptionType>
void ListFiltered(ContextType ctx, ThisType thisObject, size_t argumentCount, const ArgumentsType &arguments, ReturnType &returnObject, ExceptionType &exceptionObject) {
try { try {
List *list = RJSGetInternal<List *>(thisObject); List *list = RJSGetInternal<List *>(thisObject);
RJSValidateArgumentCountIsAtLeast(argumentCount, 1); RJSValidateArgumentCountIsAtLeast(argumentCount, 1);
SharedRealm sharedRealm = *RJSGetInternal<SharedRealm *>(thisObject); SharedRealm sharedRealm = *RJSGetInternal<SharedRealm *>(thisObject);
return RJSResultsCreateFiltered(ctx, sharedRealm, list->get_object_schema(), std::move(list->get_query()), argumentCount, arguments); returnObject = RJSResultsCreateFiltered(ctx, sharedRealm, list->get_object_schema(), std::move(list->get_query()), argumentCount, arguments);
} }
catch (std::exception &exp) { catch (std::exception &exp) {
if (jsException) { RJSSetException(ctx, exceptionObject, exp);
*jsException = RJSMakeError(ctx, exp);
} }
}
return NULL;
} }
JSValueRef ListSorted(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* jsException) { template<typename ContextType, typename ThisType, typename ArgumentsType, typename ReturnType, typename ExceptionType>
void ListSorted(ContextType ctx, ThisType thisObject, size_t argumentCount, const ArgumentsType &arguments, ReturnType &returnObject, ExceptionType &exceptionObject) {
try { try {
List *list = RJSGetInternal<List *>(thisObject); List *list = RJSGetInternal<List *>(thisObject);
RJSValidateArgumentRange(argumentCount, 1, 2); RJSValidateArgumentRange(argumentCount, 1, 2);
SharedRealm sharedRealm = *RJSGetInternal<SharedRealm *>(thisObject); SharedRealm sharedRealm = *RJSGetInternal<SharedRealm *>(thisObject);
return RJSResultsCreateSorted(ctx, sharedRealm, list->get_object_schema(), std::move(list->get_query()), argumentCount, arguments); returnObject = RJSResultsCreateSorted(ctx, sharedRealm, list->get_object_schema(), std::move(list->get_query()), argumentCount, arguments);
} }
catch (std::exception &exp) { catch (std::exception &exp) {
if (jsException) { RJSSetException(ctx, exceptionObject, exp);
*jsException = RJSMakeError(ctx, exp);
} }
}
return NULL;
} }
#define LIST_METHOD(METHOD_NAME) \
JSValueRef METHOD_NAME(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* jsException) { \
JSValueRef returnObject = NULL; \
METHOD_NAME(ctx, thisObject, argumentCount, arguments, returnObject, jsException); \
return returnObject; \
}
LIST_METHOD(ListPush)
LIST_METHOD(ListPop)
LIST_METHOD(ListUnshift)
LIST_METHOD(ListShift)
LIST_METHOD(ListSplice)
LIST_METHOD(ListStaticResults)
LIST_METHOD(ListFiltered)
LIST_METHOD(ListSorted)
JSObjectRef RJSListCreate(JSContextRef ctx, List &list) { JSObjectRef RJSListCreate(JSContextRef ctx, List &list) {
return RJSWrapObject<List *>(ctx, RJSListClass(), new List(list)); return RJSWrapObject<List *>(ctx, RJSListClass(), new List(list));
} }