| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| part of syncbase_client; |
| |
| const String _nullASCII = '\x00'; |
| |
| class RowRange { |
| List<int> start; |
| List<int> limit; |
| |
| RowRange(this.start, this.limit); |
| |
| RowRange.prefix(String prefix) |
| : start = UTF8.encode(prefix), |
| limit = _prefixRangeLimit(prefix); |
| |
| RowRange.singleRow(String key) |
| : start = UTF8.encode(key), |
| limit = UTF8.encode(key + _nullASCII); |
| } |
| |
| // prefixRangeLimit returns the limit of the row range for the given prefix. |
| List<int> _prefixRangeLimit(String prefix) { |
| // A string is a []byte, i.e. can be thought of as a base-256 number. The code |
| // below effectively adds 1 to this number, then chops off any trailing \x00 |
| // bytes. If the input string consists entirely of \xff bytes, we return an |
| // empty string. |
| List<int> bytes = UTF8.encode(prefix); |
| while (bytes.length > 0) { |
| var last = bytes.length - 1; |
| if (bytes[last] == 255) { |
| bytes.removeAt(last); // remove trailing \x00 |
| } else { |
| bytes[last] += 1; // add 1 |
| break; // no carry |
| } |
| } |
| |
| return bytes; |
| } |