Home | History | Annotate | Download | only in range
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ui/gfx/range/range.h"
      6 
      7 #include <algorithm>
      8 #include <limits>
      9 
     10 #include "base/format_macros.h"
     11 #include "base/logging.h"
     12 #include "base/strings/stringprintf.h"
     13 
     14 namespace gfx {
     15 
     16 Range::Range()
     17     : start_(0),
     18       end_(0) {
     19 }
     20 
     21 Range::Range(size_t start, size_t end)
     22     : start_(start),
     23       end_(end) {
     24 }
     25 
     26 Range::Range(size_t position)
     27     : start_(position),
     28       end_(position) {
     29 }
     30 
     31 // static
     32 const Range Range::InvalidRange() {
     33   return Range(std::numeric_limits<size_t>::max());
     34 }
     35 
     36 bool Range::IsValid() const {
     37   return *this != InvalidRange();
     38 }
     39 
     40 size_t Range::GetMin() const {
     41   return std::min(start(), end());
     42 }
     43 
     44 size_t Range::GetMax() const {
     45   return std::max(start(), end());
     46 }
     47 
     48 bool Range::operator==(const Range& other) const {
     49   return start() == other.start() && end() == other.end();
     50 }
     51 
     52 bool Range::operator!=(const Range& other) const {
     53   return !(*this == other);
     54 }
     55 
     56 bool Range::EqualsIgnoringDirection(const Range& other) const {
     57   return GetMin() == other.GetMin() && GetMax() == other.GetMax();
     58 }
     59 
     60 bool Range::Intersects(const Range& range) const {
     61   return IsValid() && range.IsValid() &&
     62       !(range.GetMax() < GetMin() || range.GetMin() >= GetMax());
     63 }
     64 
     65 bool Range::Contains(const Range& range) const {
     66   return IsValid() && range.IsValid() &&
     67       GetMin() <= range.GetMin() && range.GetMax() <= GetMax();
     68 }
     69 
     70 Range Range::Intersect(const Range& range) const {
     71   size_t min = std::max(GetMin(), range.GetMin());
     72   size_t max = std::min(GetMax(), range.GetMax());
     73 
     74   if (min >= max)  // No intersection.
     75     return InvalidRange();
     76 
     77   return Range(min, max);
     78 }
     79 
     80 std::string Range::ToString() const {
     81   return base::StringPrintf("{%" PRIuS ",%" PRIuS "}", start(), end());
     82 }
     83 
     84 std::ostream& operator<<(std::ostream& os, const Range& range) {
     85   return os << range.ToString();
     86 }
     87 
     88 }  // namespace gfx
     89