aboutsummaryrefslogtreecommitdiff
path: root/interval/u64.go
blob: b0f8a3a9f089c4fb26d539efc7f43816a39fc116 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// 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)
	}
}