// 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_INCLUDE_CPVT_WORDRANGE_H_
#define CORE_FPDFDOC_INCLUDE_CPVT_WORDRANGE_H_

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

struct CPVT_WordRange {
  CPVT_WordRange() {}

  CPVT_WordRange(const CPVT_WordPlace& begin, const CPVT_WordPlace& end) {
    Set(begin, end);
  }

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

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

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

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

  FX_BOOL IsExist() const { return BeginPos != EndPos; }

  FX_BOOL operator!=(const CPVT_WordRange& wr) const {
    return wr.BeginPos != BeginPos || wr.EndPos != EndPos;
  }

  void SwapWordPlace() {
    if (BeginPos.WordCmp(EndPos) > 0) {
      CPVT_WordPlace place = EndPos;
      EndPos = BeginPos;
      BeginPos = place;
    }
  }

  CPVT_WordPlace BeginPos;
  CPVT_WordPlace EndPos;
};

#endif  // CORE_FPDFDOC_INCLUDE_CPVT_WORDRANGE_H_
