// Copyright 2016 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef CORE_FPDFDOC_CPVT_WORDRANGE_H_
#define CORE_FPDFDOC_CPVT_WORDRANGE_H_

#include <algorithm>
#include <utility>

#include "core/fpdfdoc/cpvt_wordplace.h"
#include "core/fxcrt/fx_system.h"

struct CPVT_WordRange {
  CPVT_WordRange() {}

  CPVT_WordRange(const CPVT_WordPlace& begin, const CPVT_WordPlace& end)
      : BeginPos(begin), EndPos(end) {
    Normalize();
  }

  void Reset() {
    BeginPos.Reset();
    EndPos.Reset();
  }

  void Set(const CPVT_WordPlace& begin, const CPVT_WordPlace& end) {
    BeginPos = begin;
    EndPos = end;
    Normalize();
  }

  void SetBeginPos(const CPVT_WordPlace& begin) {
    BeginPos = begin;
    Normalize();
  }

  void SetEndPos(const CPVT_WordPlace& end) {
    EndPos = end;
    Normalize();
  }

  CPVT_WordRange Intersect(const CPVT_WordRange& that) const {
    if (that.EndPos < BeginPos || that.BeginPos > EndPos ||
        EndPos < that.BeginPos || BeginPos > that.EndPos) {
      return CPVT_WordRange();
    }

    return CPVT_WordRange(std::max(BeginPos, that.BeginPos),
                          std::min(EndPos, that.EndPos));
  }

  inline bool IsEmpty() const { return BeginPos == EndPos; }
  inline bool operator==(const CPVT_WordRange& wr) const {
    return wr.BeginPos == BeginPos && wr.EndPos == EndPos;
  }
  inline bool operator!=(const CPVT_WordRange& wr) const {
    return !(*this == wr);
  }

  void Normalize() {
    if (BeginPos > EndPos)
      std::swap(BeginPos, EndPos);
  }

  CPVT_WordPlace BeginPos;
  CPVT_WordPlace EndPos;
};

#endif  // CORE_FPDFDOC_CPVT_WORDRANGE_H_
