// 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_SPECIFICITY_H_
#define COBALT_CSSOM_SPECIFICITY_H_

#include "base/basictypes.h"
#include "base/logging.h"

namespace cobalt {
namespace cssom {

// A selector's specificity is calculated as follows:
// Count the number of ID selectors in the selector (A)
// Count the number of class selectors, attributes selectors, and
// pseudo-classes in the selector (B)
// Count the number of type selectors and pseudo-elements in the selector (C)
//   https://www.w3.org/TR/selectors4/#specificity
// When adding two specificities, clampping the result at each field (A, B and
// C).
class Specificity {
 public:
  Specificity() {
    v_[0] = 0;
    v_[1] = 0;
    v_[2] = 0;
  }

  Specificity(int8 a, int8 b, int8 c) {
    DCHECK_GE(a, 0) << "Specificity field cannot be negative.";
    DCHECK_GE(b, 0) << "Specificity field cannot be negative.";
    DCHECK_GE(c, 0) << "Specificity field cannot be negative.";
    v_[0] = a;
    v_[1] = b;
    v_[2] = c;
  }

  // Adds the value of another specificity to self.
  void AddFrom(const Specificity& rhs);

  // Specificity fields are compared lexicographically.
  bool operator<(const Specificity& rhs) const {
    return v_[0] < rhs.v_[0] ||
           (v_[0] == rhs.v_[0] &&
            (v_[1] < rhs.v_[1] || (v_[1] == rhs.v_[1] && v_[2] < rhs.v_[2])));
  }
  bool operator>(const Specificity& rhs) const {
    return v_[0] > rhs.v_[0] ||
           (v_[0] == rhs.v_[0] &&
            (v_[1] > rhs.v_[1] || (v_[1] == rhs.v_[1] && v_[2] > rhs.v_[2])));
  }
  bool operator==(const Specificity& rhs) const {
    return v_[0] == rhs.v_[0] && v_[1] == rhs.v_[1] && v_[2] == rhs.v_[2];
  }

 private:
  int8 v_[3];
};

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_SPECIFICITY_H_
