Beispiel #1
0
        public static bool Find(IBinarySearchRangeData <PropertyDatabaseRecordKey> store, PropertyDatabaseRecordKey recordKey, out long index)
        {
            if (store.length == 0)
            {
                index = 0;
                return(false);
            }

            var searchRange = new BinarySearchRange()
            {
                startOffset = 0, endOffset = store.length, halfOffset = store.length / 2
            };

            while (true)
            {
                index = searchRange.halfOffset;
                var currentRecordKey = store[index];

                if (recordKey == currentRecordKey)
                {
                    index = searchRange.halfOffset;
                    return(true);
                }

                if (recordKey < currentRecordKey)
                {
                    searchRange.endOffset  = searchRange.halfOffset;
                    searchRange.halfOffset = searchRange.startOffset + (searchRange.endOffset - searchRange.startOffset) / 2;

                    if (searchRange.halfOffset == searchRange.endOffset)
                    {
                        break;
                    }
                }
                else
                {
                    searchRange.startOffset = searchRange.halfOffset;
                    searchRange.halfOffset  = searchRange.startOffset + (searchRange.endOffset - searchRange.startOffset) / 2;

                    if (searchRange.halfOffset == searchRange.startOffset)
                    {
                        ++index;
                        break;
                    }
                }
            }

            return(false);
        }
Beispiel #2
0
        public static BinarySearchRange FindRange <TRangeData>(IBinarySearchRange <TRangeData> range, IBinarySearchRangeData <TRangeData> data)
        {
            #if PACKAGE_PERFORMANCE_TRACKING
            // using (new PerformanceTracker(nameof(FindRange)))
            #endif
            {
                var nbValues = data.length;
                if (nbValues == 0)
                {
                    return(BinarySearchRange.invalid);
                }

                var binarySearchRangeStart = new BinarySearchRange {
                    startOffset = 0, endOffset = nbValues, halfOffset = nbValues / 2
                };
                var binarySearchRangeEnd = new BinarySearchRange {
                    startOffset = 0, endOffset = nbValues, halfOffset = nbValues / 2
                };
                var foundStartOffset = false;
                var foundEndOffset   = false;
                while (!foundStartOffset || !foundEndOffset)
                {
                    if (!foundStartOffset)
                    {
                        // Update StartIndex
                        var startValue = data[binarySearchRangeStart.halfOffset];
                        if (range.StartIsInRange(startValue))
                        {
                            binarySearchRangeStart.endOffset  = binarySearchRangeStart.halfOffset;
                            binarySearchRangeStart.halfOffset = binarySearchRangeStart.startOffset + (binarySearchRangeStart.endOffset - binarySearchRangeStart.startOffset) / 2;

                            if (binarySearchRangeStart.endOffset == binarySearchRangeStart.halfOffset)
                            {
                                foundStartOffset = true;
                            }
                        }
                        else
                        {
                            // value is outside of the file
                            if (binarySearchRangeStart.halfOffset >= nbValues - 1)
                            {
                                return(BinarySearchRange.invalid);
                            }

                            binarySearchRangeStart.startOffset = binarySearchRangeStart.halfOffset;
                            binarySearchRangeStart.halfOffset  = binarySearchRangeStart.startOffset + (binarySearchRangeStart.endOffset - binarySearchRangeStart.startOffset) / 2;

                            if (binarySearchRangeStart.startOffset == binarySearchRangeStart.halfOffset)
                            {
                                foundStartOffset = true;
                            }
                        }
                    }

                    if (!foundEndOffset)
                    {
                        // Update EndIndex
                        var endValue = data[binarySearchRangeEnd.halfOffset];
                        if (range.EndIsInRange(endValue))
                        {
                            binarySearchRangeEnd.startOffset = binarySearchRangeEnd.halfOffset;
                            binarySearchRangeEnd.halfOffset  = binarySearchRangeEnd.startOffset + (binarySearchRangeEnd.endOffset - binarySearchRangeEnd.startOffset) / 2;

                            if (binarySearchRangeEnd.startOffset == binarySearchRangeEnd.halfOffset)
                            {
                                foundEndOffset = true;
                            }
                        }
                        else
                        {
                            // value is outside of the file
                            if (binarySearchRangeEnd.halfOffset == 0)
                            {
                                return(BinarySearchRange.invalid);
                            }

                            binarySearchRangeEnd.endOffset  = binarySearchRangeEnd.halfOffset;
                            binarySearchRangeEnd.halfOffset = binarySearchRangeEnd.startOffset + (binarySearchRangeEnd.endOffset - binarySearchRangeEnd.startOffset) / 2;

                            if (binarySearchRangeEnd.endOffset == binarySearchRangeEnd.halfOffset)
                            {
                                foundEndOffset = true;
                            }
                        }
                    }
                }

                // We take the endOffset because we know the values of interests lie on these offset.
                return(new BinarySearchRange {
                    startOffset = binarySearchRangeStart.endOffset, endOffset = binarySearchRangeEnd.endOffset
                });
            }
        }
Beispiel #3
0
        public static BinarySearchRange FindMaskRange(IBinarySearchRangeData <PropertyDatabaseRecordKey> store, ulong documentKeyMask)
        {
            var range = new PropertyDatabaseDocumentKeyMaskRange(documentKeyMask);

            return(BinarySearchFinder.FindRange(range, store));
        }
Beispiel #4
0
        public static BinarySearchRange FindHiWordRange(IBinarySearchRangeData <PropertyDatabaseRecordKey> store, uint documentKeyHiWord)
        {
            var range = new PropertyDatabaseDocumentKeyHiWordRange(documentKeyHiWord);

            return(BinarySearchFinder.FindRange(range, store));
        }