forked from google/gapid
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcmd_id_range.go
89 lines (75 loc) · 2.45 KB
/
cmd_id_range.go
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
77
78
79
80
81
82
83
84
85
86
87
88
89
// Copyright (C) 2017 Google Inc.
//
// 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 api
import (
"fmt"
"github.com/google/gapid/core/math/interval"
)
// CmdIDRange describes an interval of commands.
type CmdIDRange struct {
Start CmdID // The first command within the range.
End CmdID // One past the last command within the range.
}
// String returns a string representing the range.
func (i CmdIDRange) String() string {
return fmt.Sprintf("[%d..%d]", i.Start, i.End-1)
}
// Contains returns true if id is within the range, otherwise false.
func (i CmdIDRange) Contains(id CmdID) bool {
return id >= i.Start && id < i.End
}
// Clamp returns the nearest index in the range to id.
func (i CmdIDRange) Clamp(id CmdID) CmdID {
if id < i.Start {
return i.Start
}
if id >= i.End {
return i.End - 1
}
return id
}
// Length returns the number of commands in the range.
func (i CmdIDRange) Length() uint64 {
return uint64(i.End - i.Start)
}
// CmdIDRange returns the start and end of the range.
func (i CmdIDRange) CmdIDRange() (start, end CmdID) {
return i.Start, i.End
}
// First returns the first command index within the range.
func (i CmdIDRange) First() CmdID {
return i.Start
}
// Last returns the last command index within the range.
func (i CmdIDRange) Last() CmdID {
return i.End - 1
}
// Span returns the start and end of the range as a U64Span.
func (i CmdIDRange) Span() interval.U64Span {
return interval.U64Span{Start: uint64(i.Start), End: uint64(i.End)}
}
// SetSpan sets the start and end range using a U64Span.
func (i *CmdIDRange) SetSpan(span interval.U64Span) {
i.Start = CmdID(span.Start)
i.End = CmdID(span.End)
}
// Split splits this range into two subranges where the first range will have
// a length no larger than the given value.
func (r CmdIDRange) Split(i uint64) (*CmdIDRange, *CmdIDRange) {
if i >= r.Length() {
return &r, &CmdIDRange{0, 0}
}
x := r.Start + CmdID(i)
return &CmdIDRange{r.Start, x}, &CmdIDRange{x, r.End}
}