1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #ifndef UI_GFX_RANGE_RANGE_H_ 6*635a8641SAndroid Build Coastguard Worker #define UI_GFX_RANGE_RANGE_H_ 7*635a8641SAndroid Build Coastguard Worker 8*635a8641SAndroid Build Coastguard Worker #include <stddef.h> 9*635a8641SAndroid Build Coastguard Worker #include <stdint.h> 10*635a8641SAndroid Build Coastguard Worker 11*635a8641SAndroid Build Coastguard Worker #include <limits> 12*635a8641SAndroid Build Coastguard Worker #include <ostream> 13*635a8641SAndroid Build Coastguard Worker #include <string> 14*635a8641SAndroid Build Coastguard Worker 15*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h" 16*635a8641SAndroid Build Coastguard Worker #include "ui/gfx/range/gfx_range_export.h" 17*635a8641SAndroid Build Coastguard Worker 18*635a8641SAndroid Build Coastguard Worker #if defined(OS_MACOSX) 19*635a8641SAndroid Build Coastguard Worker #if __OBJC__ 20*635a8641SAndroid Build Coastguard Worker #import <Foundation/Foundation.h> 21*635a8641SAndroid Build Coastguard Worker #else 22*635a8641SAndroid Build Coastguard Worker typedef struct _NSRange NSRange; 23*635a8641SAndroid Build Coastguard Worker #endif 24*635a8641SAndroid Build Coastguard Worker #endif // defined(OS_MACOSX) 25*635a8641SAndroid Build Coastguard Worker 26*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN) 27*635a8641SAndroid Build Coastguard Worker typedef struct _charrange CHARRANGE; 28*635a8641SAndroid Build Coastguard Worker #endif 29*635a8641SAndroid Build Coastguard Worker 30*635a8641SAndroid Build Coastguard Worker namespace gfx { 31*635a8641SAndroid Build Coastguard Worker 32*635a8641SAndroid Build Coastguard Worker // A Range contains two integer values that represent a numeric range, like the 33*635a8641SAndroid Build Coastguard Worker // range of characters in a text selection. A range is made of a start and end 34*635a8641SAndroid Build Coastguard Worker // position; when they are the same, the Range is akin to a caret. Note that 35*635a8641SAndroid Build Coastguard Worker // |start_| can be greater than |end_| to respect the directionality of the 36*635a8641SAndroid Build Coastguard Worker // range. 37*635a8641SAndroid Build Coastguard Worker class GFX_RANGE_EXPORT Range { 38*635a8641SAndroid Build Coastguard Worker public: 39*635a8641SAndroid Build Coastguard Worker // Creates an empty range {0,0}. Range()40*635a8641SAndroid Build Coastguard Worker constexpr Range() : Range(0) {} 41*635a8641SAndroid Build Coastguard Worker 42*635a8641SAndroid Build Coastguard Worker // Initializes the range with a start and end. Range(uint32_t start,uint32_t end)43*635a8641SAndroid Build Coastguard Worker constexpr Range(uint32_t start, uint32_t end) : start_(start), end_(end) {} 44*635a8641SAndroid Build Coastguard Worker 45*635a8641SAndroid Build Coastguard Worker // Initializes the range with the same start and end positions. Range(uint32_t position)46*635a8641SAndroid Build Coastguard Worker constexpr explicit Range(uint32_t position) : Range(position, position) {} 47*635a8641SAndroid Build Coastguard Worker 48*635a8641SAndroid Build Coastguard Worker // Platform constructors. 49*635a8641SAndroid Build Coastguard Worker #if defined(OS_MACOSX) 50*635a8641SAndroid Build Coastguard Worker explicit Range(const NSRange& range); 51*635a8641SAndroid Build Coastguard Worker #elif defined(OS_WIN) 52*635a8641SAndroid Build Coastguard Worker // The |total_length| paramater should be used if the CHARRANGE is set to 53*635a8641SAndroid Build Coastguard Worker // {0,-1} to indicate the whole range. 54*635a8641SAndroid Build Coastguard Worker Range(const CHARRANGE& range, long total_length = -1); 55*635a8641SAndroid Build Coastguard Worker #endif 56*635a8641SAndroid Build Coastguard Worker 57*635a8641SAndroid Build Coastguard Worker // Returns a range that is invalid, which is {UINT32_MAX,UINT32_MAX}. InvalidRange()58*635a8641SAndroid Build Coastguard Worker static constexpr Range InvalidRange() { 59*635a8641SAndroid Build Coastguard Worker return Range(std::numeric_limits<uint32_t>::max()); 60*635a8641SAndroid Build Coastguard Worker } 61*635a8641SAndroid Build Coastguard Worker 62*635a8641SAndroid Build Coastguard Worker // Checks if the range is valid through comparison to InvalidRange(). IsValid()63*635a8641SAndroid Build Coastguard Worker constexpr bool IsValid() const { return *this != InvalidRange(); } 64*635a8641SAndroid Build Coastguard Worker 65*635a8641SAndroid Build Coastguard Worker // Getters and setters. start()66*635a8641SAndroid Build Coastguard Worker constexpr uint32_t start() const { return start_; } set_start(uint32_t start)67*635a8641SAndroid Build Coastguard Worker void set_start(uint32_t start) { start_ = start; } 68*635a8641SAndroid Build Coastguard Worker end()69*635a8641SAndroid Build Coastguard Worker constexpr uint32_t end() const { return end_; } set_end(uint32_t end)70*635a8641SAndroid Build Coastguard Worker void set_end(uint32_t end) { end_ = end; } 71*635a8641SAndroid Build Coastguard Worker 72*635a8641SAndroid Build Coastguard Worker // Returns the absolute value of the length. length()73*635a8641SAndroid Build Coastguard Worker constexpr uint32_t length() const { return GetMax() - GetMin(); } 74*635a8641SAndroid Build Coastguard Worker is_reversed()75*635a8641SAndroid Build Coastguard Worker constexpr bool is_reversed() const { return start() > end(); } is_empty()76*635a8641SAndroid Build Coastguard Worker constexpr bool is_empty() const { return start() == end(); } 77*635a8641SAndroid Build Coastguard Worker 78*635a8641SAndroid Build Coastguard Worker // Returns the minimum and maximum values. GetMin()79*635a8641SAndroid Build Coastguard Worker constexpr uint32_t GetMin() const { 80*635a8641SAndroid Build Coastguard Worker return start() < end() ? start() : end(); 81*635a8641SAndroid Build Coastguard Worker } GetMax()82*635a8641SAndroid Build Coastguard Worker constexpr uint32_t GetMax() const { 83*635a8641SAndroid Build Coastguard Worker return start() > end() ? start() : end(); 84*635a8641SAndroid Build Coastguard Worker } 85*635a8641SAndroid Build Coastguard Worker 86*635a8641SAndroid Build Coastguard Worker constexpr bool operator==(const Range& other) const { 87*635a8641SAndroid Build Coastguard Worker return start() == other.start() && end() == other.end(); 88*635a8641SAndroid Build Coastguard Worker } 89*635a8641SAndroid Build Coastguard Worker constexpr bool operator!=(const Range& other) const { 90*635a8641SAndroid Build Coastguard Worker return !(*this == other); 91*635a8641SAndroid Build Coastguard Worker } EqualsIgnoringDirection(const Range & other)92*635a8641SAndroid Build Coastguard Worker constexpr bool EqualsIgnoringDirection(const Range& other) const { 93*635a8641SAndroid Build Coastguard Worker return GetMin() == other.GetMin() && GetMax() == other.GetMax(); 94*635a8641SAndroid Build Coastguard Worker } 95*635a8641SAndroid Build Coastguard Worker 96*635a8641SAndroid Build Coastguard Worker // Returns true if this range intersects the specified |range|. Intersects(const Range & range)97*635a8641SAndroid Build Coastguard Worker constexpr bool Intersects(const Range& range) const { 98*635a8641SAndroid Build Coastguard Worker return IsValid() && range.IsValid() && 99*635a8641SAndroid Build Coastguard Worker !(range.GetMax() < GetMin() || range.GetMin() >= GetMax()); 100*635a8641SAndroid Build Coastguard Worker } 101*635a8641SAndroid Build Coastguard Worker 102*635a8641SAndroid Build Coastguard Worker // Returns true if this range contains the specified |range|. Contains(const Range & range)103*635a8641SAndroid Build Coastguard Worker constexpr bool Contains(const Range& range) const { 104*635a8641SAndroid Build Coastguard Worker return IsValid() && range.IsValid() && GetMin() <= range.GetMin() && 105*635a8641SAndroid Build Coastguard Worker range.GetMax() <= GetMax(); 106*635a8641SAndroid Build Coastguard Worker } 107*635a8641SAndroid Build Coastguard Worker 108*635a8641SAndroid Build Coastguard Worker // Computes the intersection of this range with the given |range|. 109*635a8641SAndroid Build Coastguard Worker // If they don't intersect, it returns an InvalidRange(). 110*635a8641SAndroid Build Coastguard Worker // The returned range is always empty or forward (never reversed). 111*635a8641SAndroid Build Coastguard Worker Range Intersect(const Range& range) const; 112*635a8641SAndroid Build Coastguard Worker 113*635a8641SAndroid Build Coastguard Worker #if defined(OS_MACOSX) 114*635a8641SAndroid Build Coastguard Worker Range& operator=(const NSRange& range); 115*635a8641SAndroid Build Coastguard Worker 116*635a8641SAndroid Build Coastguard Worker // NSRange does not store the directionality of a range, so if this 117*635a8641SAndroid Build Coastguard Worker // is_reversed(), the range will get flipped when converted to an NSRange. 118*635a8641SAndroid Build Coastguard Worker NSRange ToNSRange() const; 119*635a8641SAndroid Build Coastguard Worker #elif defined(OS_WIN) 120*635a8641SAndroid Build Coastguard Worker CHARRANGE ToCHARRANGE() const; 121*635a8641SAndroid Build Coastguard Worker #endif 122*635a8641SAndroid Build Coastguard Worker // GTK+ has no concept of a range. 123*635a8641SAndroid Build Coastguard Worker 124*635a8641SAndroid Build Coastguard Worker std::string ToString() const; 125*635a8641SAndroid Build Coastguard Worker 126*635a8641SAndroid Build Coastguard Worker private: 127*635a8641SAndroid Build Coastguard Worker // Note: we use uint32_t instead of size_t because this struct is sent over 128*635a8641SAndroid Build Coastguard Worker // IPC which could span 32 & 64 bit processes. This is fine since text spans 129*635a8641SAndroid Build Coastguard Worker // shouldn't exceed UINT32_MAX even on 64 bit builds. 130*635a8641SAndroid Build Coastguard Worker uint32_t start_; 131*635a8641SAndroid Build Coastguard Worker uint32_t end_; 132*635a8641SAndroid Build Coastguard Worker }; 133*635a8641SAndroid Build Coastguard Worker 134*635a8641SAndroid Build Coastguard Worker GFX_RANGE_EXPORT std::ostream& operator<<(std::ostream& os, const Range& range); 135*635a8641SAndroid Build Coastguard Worker 136*635a8641SAndroid Build Coastguard Worker } // namespace gfx 137*635a8641SAndroid Build Coastguard Worker 138*635a8641SAndroid Build Coastguard Worker #endif // UI_GFX_RANGE_RANGE_H_ 139