Range.h revision d565f7d88018f09a740ff6cf26cb2b068139c784
1d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka/* 2d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka * Copyright (C) 2017 The Android Open Source Project 3d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka * 4d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka * Licensed under the Apache License, Version 2.0 (the "License"); 5d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka * you may not use this file except in compliance with the License. 6d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka * You may obtain a copy of the License at 7d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka * 8d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka * http://www.apache.org/licenses/LICENSE-2.0 9d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka * 10d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka * Unless required by applicable law or agreed to in writing, software 11d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka * distributed under the License is distributed on an "AS IS" BASIS, 12d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka * See the License for the specific language governing permissions and 14d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka * limitations under the License. 15d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka */ 16d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka 17d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka#ifndef MINIKIN_RANGE_H 18d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka#define MINIKIN_RANGE_H 19d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka 20d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonakanamespace minikin { 21d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka 22d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka// An undirected range. 23d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonakaclass Range { 24d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonakapublic: 25d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka // start must be smaller than or equal to end otherwise the behavior is undefined. 26d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka Range(uint32_t start, uint32_t end) : mStart(start), mEnd(end) {} 27d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka 28d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka Range(const Range&) = default; 29d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka Range& operator=(const Range&) = default; 30d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka 31d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka inline uint32_t getStart() const { return mStart; } // inclusive 32d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka inline void setStart(uint32_t start) { mStart = start; } // inclusive 33d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka 34d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka inline uint32_t getEnd() const { return mEnd; } // exclusive 35d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka inline void setEnd(uint32_t end) { mEnd = end; } // exclusive 36d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka 37d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka inline uint32_t getLength() const { return mEnd - mStart; } 38d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka 39d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka inline bool isEmpty() const { return mStart == mEnd; } 40d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka 41d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka inline uint32_t toRangeOffset(uint32_t globalPos) const { return globalPos - mStart; } 42d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka inline uint32_t toGlobalOffset(uint32_t rangePos) const { return mStart + rangePos; } 43d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka 44d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka // The behavior is undefined if pos is out of range. 45d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka inline std::pair<Range, Range> split(uint32_t pos) const { 46d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka return std::make_pair(Range(mStart, pos), Range(pos, mEnd)); 47d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka } 48d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka 49d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka inline bool contains(const Range& other) const { 50d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka return mStart <= other.mStart && other.mEnd <= mEnd; 51d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka } 52d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka 53d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka // Returns true if the pos is in this range. 54d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka // For example, 55d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka // const Range range(1, 2); // 1 is inclusive, 2 is exclusive. 56d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka // range.contains(0); // false 57d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka // range.contains(1); // true 58d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka // range.contains(2); // false 59d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka inline bool contains(uint32_t pos) const { 60d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka return mStart <= pos && pos < mEnd; 61d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka } 62d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka 63d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonakaprivate: 64d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka // Helper class for "for (uint32_t i : range)" style for-loop. 65d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka class RangeIterator { 66d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka public: 67d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka RangeIterator(uint32_t pos) : mPos(pos) {} 68d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka 69d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka inline bool operator!=(const RangeIterator& o) const { return o.mPos != mPos; } 70d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka inline uint32_t operator*() const { return mPos; } 71d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka inline RangeIterator& operator++() { mPos++; return *this; } 72d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka 73d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka private: 74d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka uint32_t mPos; 75d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka }; 76d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka 77d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonakapublic: 78d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka inline RangeIterator begin() const { return RangeIterator(mStart); } 79d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka inline RangeIterator end() const { return RangeIterator(mEnd); } 80d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka 81d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonakaprivate: 82d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka uint32_t mStart; 83d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka uint32_t mEnd; 84d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka}; 85d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka 86d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka} // namespace minikin 87d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka 88d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka#endif // MINIKIN_RANGE_H 89