// Copyright (C) 2015 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package interval // U64Span is the base interval type understood by the algorithms in this package. // It is a half open interval that includes the lower bound, but not the upper. type U64Span struct { Start uint64 // the value at which the interval begins End uint64 // the next value not included in the interval. } // U64Range is an interval specified by a beginning and size. type U64Range struct { First uint64 // the first value in the interval Count uint64 // the count of values in the interval } // U64SpanList implements List for an array of U64Span intervals type U64SpanList []U64Span // U64RangeList implements List for an array of U64Range intervals type U64RangeList []U64Range // Range converts a U64Span to a U64Range func (s U64Span) Range() U64Range { return U64Range{First: s.Start, Count: s.End - s.Start} } // Span converts a U64Range to a U64Span func (r U64Range) Span() U64Span { return U64Span{Start: r.First, End: r.First + r.Count} } func (l U64SpanList) Length() int { return len(l) } func (l U64SpanList) GetSpan(index int) U64Span { return l[index] } func (l U64SpanList) SetSpan(index int, span U64Span) { l[index] = span } func (l U64SpanList) Copy(to, from, count int) { copy(l[to:to+count], l[from:from+count]) } func (l *U64SpanList) Resize(length int) { if cap(*l) > length { *l = (*l)[:length] } else { old := *l capacity := cap(*l) * 2 if capacity < length { capacity = length } *l = make(U64SpanList, length, capacity) copy(*l, old) } } func (l U64RangeList) Length() int { return len(l) } func (l U64RangeList) GetSpan(index int) U64Span { return l[index].Span() } func (l U64RangeList) SetSpan(index int, span U64Span) { l[index] = span.Range() } func (l U64RangeList) Copy(to, from, count int) { copy(l[to:to+count], l[from:from+count]) } func (l *U64RangeList) Resize(length int) { if cap(*l) > length { *l = (*l)[:length] } else { old := *l capacity := cap(*l) * 2 if capacity < length { capacity = length } *l = make(U64RangeList, length, capacity) copy(*l, old) } }