Range.h revision 6c8722e217ff5238f0b849152d7936959a728103
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
316c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka    inline uint32_t getStart() const { return mStart; }       // inclusive
32d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka    inline void setStart(uint32_t start) { mStart = start; }  // inclusive
33d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka
346c8722e217ff5238f0b849152d7936959a728103Seigo 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
596c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka    inline bool contains(uint32_t pos) const { return mStart <= pos && pos < mEnd; }
60d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka
61d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonakaprivate:
62d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka    // Helper class for "for (uint32_t i : range)" style for-loop.
63d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka    class RangeIterator {
64d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka    public:
65d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka        RangeIterator(uint32_t pos) : mPos(pos) {}
66d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka
67d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka        inline bool operator!=(const RangeIterator& o) const { return o.mPos != mPos; }
68d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka        inline uint32_t operator*() const { return mPos; }
696c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka        inline RangeIterator& operator++() {
706c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            mPos++;
716c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            return *this;
726c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka        }
73d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka
74d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka    private:
75d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka        uint32_t mPos;
76d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka    };
77d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka
78d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonakapublic:
79d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka    inline RangeIterator begin() const { return RangeIterator(mStart); }
80d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka    inline RangeIterator end() const { return RangeIterator(mEnd); }
81d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka
82d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonakaprivate:
83d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka    uint32_t mStart;
84d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka    uint32_t mEnd;
85d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka};
86d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka
87d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka}  // namespace minikin
88d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka
89d565f7d88018f09a740ff6cf26cb2b068139c784Seigo Nonaka#endif  // MINIKIN_RANGE_H
90