/*
 * Copyright 2014 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_SELECTOR_VISITOR_H_
#define COBALT_CSSOM_SELECTOR_VISITOR_H_

namespace cobalt {
namespace cssom {

class ActivePseudoClass;
class AfterPseudoElement;
class BeforePseudoElement;
class ClassSelector;
class ComplexSelector;
class CompoundSelector;
class EmptyPseudoClass;
class FocusPseudoClass;
class HoverPseudoClass;
class IdSelector;
class NotPseudoClass;
class TypeSelector;
class UniversalSelector;

// Type-safe branching on a class hierarchy of CSS selectors,
// implemented after a classical GoF pattern (see
// http://en.wikipedia.org/wiki/Visitor_pattern#Java_example).
class SelectorVisitor {
 public:
  // Simple selectors.

  virtual void VisitUniversalSelector(
      UniversalSelector* universal_selector) = 0;
  virtual void VisitTypeSelector(TypeSelector* type_selector) = 0;
  virtual void VisitClassSelector(ClassSelector* class_selector) = 0;
  virtual void VisitIdSelector(IdSelector* id_selector) = 0;

  // Pseudo classes.
  virtual void VisitActivePseudoClass(
      ActivePseudoClass* active_pseudo_class) = 0;
  virtual void VisitEmptyPseudoClass(EmptyPseudoClass* empty_pseudo_class) = 0;
  virtual void VisitFocusPseudoClass(FocusPseudoClass* focus_pseudo_class) = 0;
  virtual void VisitHoverPseudoClass(HoverPseudoClass* hover_pseudo_class) = 0;
  virtual void VisitNotPseudoClass(NotPseudoClass* not_pseudo_class) = 0;

  // Pseudo elements.
  virtual void VisitAfterPseudoElement(
      AfterPseudoElement* after_pseudo_element) = 0;
  virtual void VisitBeforePseudoElement(
      BeforePseudoElement* before_pseudo_element) = 0;

  // Compound selector.

  virtual void VisitCompoundSelector(CompoundSelector* compound_selector) = 0;

  // Complex selector.

  virtual void VisitComplexSelector(ComplexSelector* complex_selector) = 0;

 protected:
  ~SelectorVisitor() {}
};

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_SELECTOR_VISITOR_H_
