int GetLastIndex(int arr[], int length, int k, int start, int end) { if (start > end) { return -1; } int middle = start + (end - start) / 2; if (arr[middle] == k) { if ((middle == length-1) || (arr[middle + 1] != k)) { return middle; } else { start = middle + 1; } } else if (arr[middle] > k) { end = middle - 1; } else { start = middle + 1; } return GetLastIndex(arr, length, k, start, end); }
int GetNumberDigits(int arr[],int length,int k) { assert(arr); if (length <= 0) { return 0; } int start= GetFirstIndex(arr, length, k, 0, length - 1); int end = GetLastIndex(arr, length, k, 0, length - 1); int number = 0; if (start != -1 && end != -1) { number = end - start + 1; } return number; }
void UKismetArrayLibrary::GenericArray_Remove(void* TargetArray, const UArrayProperty* ArrayProp, int32 IndexToRemove) { if( TargetArray ) { FScriptArrayHelper ArrayHelper(ArrayProp, TargetArray); if( ArrayHelper.IsValidIndex(IndexToRemove) ) { ArrayHelper.RemoveValues(IndexToRemove, 1); } else { FFrame::KismetExecutionMessage(*FString::Printf(TEXT("Attempted to remove an item from an invalid index from array %s [%d/%d]!"), *ArrayProp->GetName(), IndexToRemove, GetLastIndex(ArrayHelper)), ELogVerbosity::Warning); } } }
void UKismetArrayLibrary::GenericArray_Insert(void* TargetArray, const UArrayProperty* ArrayProp, const void* NewItem, int32 Index) { if( TargetArray ) { FScriptArrayHelper ArrayHelper(ArrayProp, TargetArray); UProperty* InnerProp = ArrayProp->Inner; if (ArrayHelper.IsValidIndex(Index) || (Index >= 0 && Index <= ArrayHelper.Num()) ) { ArrayHelper.InsertValues(Index, 1); InnerProp->CopySingleValueToScriptVM(ArrayHelper.GetRawPtr(Index), NewItem); } else { FFrame::KismetExecutionMessage(*FString::Printf(TEXT("Attempted to insert an item into array %s out of bounds [%d/%d]!"), *ArrayProp->GetName(), Index, GetLastIndex(ArrayHelper)), ELogVerbosity::Warning); } } }
void UKismetArrayLibrary::GenericArray_Set(void* TargetArray, const UArrayProperty* ArrayProp, int32 Index, const void* NewItem, bool bSizeToFit) { if( TargetArray ) { FScriptArrayHelper ArrayHelper(ArrayProp, TargetArray); UProperty* InnerProp = ArrayProp->Inner; // Expand the array, if desired if (!ArrayHelper.IsValidIndex(Index) && bSizeToFit && (Index >= 0)) { ArrayHelper.ExpandForIndex(Index); } if (ArrayHelper.IsValidIndex(Index)) { InnerProp->CopySingleValueToScriptVM(ArrayHelper.GetRawPtr(Index), NewItem); } else { FFrame::KismetExecutionMessage(*FString::Printf(TEXT("Attempted to set an invalid index on array %s [%d/%d]!"), *ArrayProp->GetName(), Index, GetLastIndex(ArrayHelper)), ELogVerbosity::Warning); } } }
void UKismetArrayLibrary::GenericArray_Get(void* TargetArray, const UArrayProperty* ArrayProp, int32 Index, void* Item) { if( TargetArray ) { FScriptArrayHelper ArrayHelper(ArrayProp, TargetArray); UProperty* InnerProp = ArrayProp->Inner; if( ArrayHelper.IsValidIndex(Index) ) { InnerProp->CopyCompleteValueFromScriptVM(Item, ArrayHelper.GetRawPtr(Index)); } else { FFrame::KismetExecutionMessage(*FString::Printf(TEXT("Attempted to get an item from array %s out of bounds [%d/%d]!"), *ArrayProp->GetName(), Index, GetLastIndex(ArrayHelper)), ELogVerbosity::Warning); InnerProp->InitializeValue(Item); } } }
void UKismetArrayLibrary::GenericArray_Remove(void* TargetArray, const UArrayProperty* ArrayProp, int32 IndexToRemove) { if( TargetArray ) { FScriptArrayHelper ArrayHelper(ArrayProp, TargetArray); if( ArrayHelper.IsValidIndex(IndexToRemove) ) { ArrayHelper.RemoveValues(IndexToRemove, 1); } else { UE_LOG(LogArray, Warning, TEXT("Attempted to remove an item from an invalid index from array %s [%d/%d]!"), *ArrayProp->GetName(), IndexToRemove, GetLastIndex(ArrayHelper)); } } }
void UKismetArrayLibrary::GenericArray_Get(void* TargetArray, const UArrayProperty* ArrayProp, int32 Index, void* Item) { if( TargetArray ) { FScriptArrayHelper ArrayHelper(ArrayProp, TargetArray); UProperty* InnerProp = ArrayProp->Inner; if( ArrayHelper.IsValidIndex(Index) ) { InnerProp->CopyCompleteValueFromScriptVM(Item, ArrayHelper.GetRawPtr(Index)); } else { UE_LOG(LogArray, Warning, TEXT("Attempted to get an item from array %s out of bounds [%d/%d]!"), *ArrayProp->GetName(), Index, GetLastIndex(ArrayHelper)); InnerProp->InitializeValue(Item); } } }