// Copyright 2014 The Cobalt Authors. 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_PROPERTY_VALUE_VISITOR_H_
#define COBALT_CSSOM_PROPERTY_VALUE_VISITOR_H_

#include "base/compiler_specific.h"

namespace cobalt {
namespace cssom {

class AbsoluteURLValue;
class CalcValue;
class FilterFunctionListValue;
class FontStyleValue;
class FontWeightValue;
class IntegerValue;
class KeywordValue;
class LengthValue;
class LinearGradientValue;
class LocalSrcValue;
class MediaFeatureKeywordValue;
class NumberValue;
class PercentageValue;
class PropertyKeyListValue;
class PropertyListValue;
class PropertyValue;
class RadialGradientValue;
class RatioValue;
class ResolutionValue;
class RGBAColorValue;
class ShadowValue;
class StringValue;
class TimeListValue;
class TimingFunctionListValue;
class TransformPropertyValue;
class UnicodeRangeValue;
class URLValue;
class UrlSrcValue;

// Type-safe branching on a class hierarchy of CSS property values,
// implemented after a classical GoF pattern (see
// http://en.wikipedia.org/wiki/Visitor_pattern#Java_example).
class PropertyValueVisitor {
 public:
  virtual void VisitAbsoluteURL(AbsoluteURLValue* url_value) = 0;
  virtual void VisitCalc(CalcValue* calc_value) = 0;
  virtual void VisitFilterFunctionList(FilterFunctionListValue*) = 0;
  virtual void VisitFontStyle(FontStyleValue* font_style_value) = 0;
  virtual void VisitFontWeight(FontWeightValue* font_weight_value) = 0;
  virtual void VisitInteger(IntegerValue* integer_value) = 0;
  virtual void VisitKeyword(KeywordValue* keyword_value) = 0;
  virtual void VisitLength(LengthValue* length_value) = 0;
  virtual void VisitLinearGradient(
      LinearGradientValue* linear_gradient_value) = 0;
  virtual void VisitLocalSrc(LocalSrcValue* local_src_value) = 0;
  virtual void VisitMediaFeatureKeywordValue(
      MediaFeatureKeywordValue* media_feature_keyword_value) = 0;
  virtual void VisitNumber(NumberValue* number_value) = 0;
  virtual void VisitPercentage(PercentageValue* percentage_value) = 0;
  virtual void VisitPropertyKeyList(
      PropertyKeyListValue* property_key_list_value) = 0;
  virtual void VisitPropertyList(PropertyListValue* property_list_value) = 0;
  virtual void VisitRadialGradient(
      RadialGradientValue* radial_gradient_value) = 0;
  virtual void VisitRatio(RatioValue* ratio_value) = 0;
  virtual void VisitResolution(ResolutionValue* resolution_value) = 0;
  virtual void VisitRGBAColor(RGBAColorValue* color_value) = 0;
  virtual void VisitShadow(ShadowValue* shadow_value) = 0;
  virtual void VisitString(StringValue* string_value) = 0;
  virtual void VisitTimeList(TimeListValue* time_list_value) = 0;
  virtual void VisitTimingFunctionList(
      TimingFunctionListValue* timing_function_list_value) = 0;
  virtual void VisitTransformPropertyValue(
      TransformPropertyValue* transform_property_value) = 0;
  virtual void VisitUnicodeRange(UnicodeRangeValue* unicode_range_value) = 0;
  virtual void VisitURL(URLValue* url_value) = 0;
  virtual void VisitUrlSrc(UrlSrcValue* url_src_value) = 0;

 protected:
  ~PropertyValueVisitor() {}
};

// A convenience class that forwards all methods to |VisitDefault|, thus one can
// derive from this class, implement only the value types that they care about,
// and handle every other value type generically.
class DefaultingPropertyValueVisitor : public PropertyValueVisitor {
 public:
  void VisitAbsoluteURL(AbsoluteURLValue* url_value) override;
  void VisitCalc(CalcValue* calc_value) override;
  void VisitFilterFunctionList(
      FilterFunctionListValue* filter_function_list_value) override;
  void VisitFontStyle(FontStyleValue* font_style_value) override;
  void VisitFontWeight(FontWeightValue* font_weight_value) override;
  void VisitKeyword(KeywordValue* keyword_value) override;
  void VisitInteger(IntegerValue* integer_value) override;
  void VisitLength(LengthValue* length_value) override;
  void VisitLinearGradient(LinearGradientValue* linear_gradient_value) override;
  void VisitLocalSrc(LocalSrcValue* local_src_value) override;
  void VisitMediaFeatureKeywordValue(
      MediaFeatureKeywordValue* media_feature_keyword_value) override;
  void VisitNumber(NumberValue* number_value) override;
  void VisitPercentage(PercentageValue* percentage_value) override;
  void VisitPropertyKeyList(
      PropertyKeyListValue* property_key_list_value) override;
  void VisitPropertyList(PropertyListValue* property_list_value) override;
  void VisitRadialGradient(RadialGradientValue* radial_gradient_value) override;
  void VisitRatio(RatioValue* ratio_value) override;
  void VisitResolution(ResolutionValue* resolution_value) override;
  void VisitRGBAColor(RGBAColorValue* color_value) override;
  void VisitShadow(ShadowValue* shadow_value) override;
  void VisitString(StringValue* string_value) override;
  void VisitTimeList(TimeListValue* time_list_value) override;
  void VisitTimingFunctionList(
      TimingFunctionListValue* timing_function_list_value) override;
  void VisitTransformPropertyValue(
      TransformPropertyValue* transform_property_value) override;
  void VisitUnicodeRange(UnicodeRangeValue* unicode_range_value) override;
  void VisitURL(URLValue* url_value) override;
  void VisitUrlSrc(UrlSrcValue* url_src_value) override;

 protected:
  virtual void VisitDefault(PropertyValue* property_value) = 0;
};

// A convenience class that implements PropertyValueVisitor with NOTREACHED()
// for each method, thus one can derive from this class, implement only the
// value types that they care about, and then every other value type will
// result in an error.
class NotReachedPropertyValueVisitor : public DefaultingPropertyValueVisitor {
 protected:
  void VisitDefault(PropertyValue* property_value) override;
};

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_PROPERTY_VALUE_VISITOR_H_
