// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_CSSOM_INTEGER_VALUE_H_
#define COBALT_CSSOM_INTEGER_VALUE_H_

#include <string>

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/stringprintf.h"
#include "cobalt/base/polymorphic_equatable.h"
#include "cobalt/cssom/property_value.h"

namespace cobalt {
namespace cssom {

// Represents a dimensionless value.
//   https://www.w3.org/TR/css3-values/#integers
class IntegerValue : public PropertyValue {
 public:
  explicit IntegerValue(int value) : value_(value) {}

  virtual void Accept(PropertyValueVisitor* visitor) OVERRIDE;

  int value() const { return value_; }

  std::string ToString() const OVERRIDE {
    return base::StringPrintf("%d", value_);
  }

  bool operator==(const IntegerValue& other) const {
    return value_ == other.value_;
  }

  bool operator==(const int& other) const { return value_ == other; }

  bool operator>=(const IntegerValue& other) const {
    return value_ >= other.value_;
  }

  bool operator>=(const int& other) const { return value_ >= other; }

  bool operator<=(const IntegerValue& other) const {
    return value_ <= other.value_;
  }

  bool operator<=(const int& other) const { return value_ <= other; }

  DEFINE_POLYMORPHIC_EQUATABLE_TYPE(IntegerValue);

 private:
  ~IntegerValue() OVERRIDE {}

  const int value_;

  DISALLOW_COPY_AND_ASSIGN(IntegerValue);
};

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_INTEGER_VALUE_H_
