Index: appengine/cmd/dm/distributor/impl/jobsim/parser/range_slice.go |
diff --git a/appengine/cmd/dm/distributor/impl/jobsim/parser/range_slice.go b/appengine/cmd/dm/distributor/impl/jobsim/parser/range_slice.go |
new file mode 100644 |
index 0000000000000000000000000000000000000000..728ec619667349c9a0dc88cd54729a7ac41dcbdb |
--- /dev/null |
+++ b/appengine/cmd/dm/distributor/impl/jobsim/parser/range_slice.go |
@@ -0,0 +1,62 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package parser |
+ |
+import ( |
+ "bytes" |
+ "fmt" |
+) |
+ |
+type Range [2]uint64 |
+ |
+func (r Range) Low() uint64 { return r[0] } |
+func (r Range) Single() (uint64, bool) { return r[0], r[1] == 0 } |
+func (r Range) High() uint64 { |
+ if r[1] == 0 { |
+ return r[0] |
+ } |
+ return r[1] |
+} |
+ |
+func (r Range) Iter(cb func(uint64) error) error { |
+ if s, ok := r.Single(); ok { |
+ return cb(s) |
+ } |
+ for i := r.Low(); i < r.High(); i++ { |
+ if err := cb(i); err != nil { |
+ return err |
+ } |
+ } |
+ return nil |
+} |
+ |
+func (r Range) String() string { |
+ if s, ok := r.Single(); ok { |
+ return fmt.Sprintf("%d", s) |
+ } |
+ return fmt.Sprintf("%d-%d", r.Low(), r.High()) |
+} |
+ |
+type RangeSlice []Range |
+ |
+func (rs RangeSlice) String() string { |
+ b := bytes.Buffer{} |
+ for i, r := range rs { |
+ if i != 0 { |
+ b.WriteRune(',') |
+ } |
+ b.WriteString(r.String()) |
+ } |
+ return b.String() |
+} |
+ |
+func (rs RangeSlice) Iter(cb func(uint64) error) error { |
+ for _, rng := range rs { |
+ if err := rng.Iter(cb); err != nil { |
+ return err |
+ } |
+ } |
+ return nil |
+} |