/*
 * 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.
 */

#include "cobalt/cssom/property_value_visitor.h"

#include "base/logging.h"
#include "cobalt/cssom/absolute_url_value.h"
#include "cobalt/cssom/calc_value.h"
#include "cobalt/cssom/filter_function_list_value.h"
#include "cobalt/cssom/font_style_value.h"
#include "cobalt/cssom/font_weight_value.h"
#include "cobalt/cssom/integer_value.h"
#include "cobalt/cssom/keyword_value.h"
#include "cobalt/cssom/length_value.h"
#include "cobalt/cssom/linear_gradient_value.h"
#include "cobalt/cssom/local_src_value.h"
#include "cobalt/cssom/media_feature_keyword_value.h"
#include "cobalt/cssom/number_value.h"
#include "cobalt/cssom/percentage_value.h"
#include "cobalt/cssom/property_key_list_value.h"
#include "cobalt/cssom/property_list_value.h"
#include "cobalt/cssom/radial_gradient_value.h"
#include "cobalt/cssom/ratio_value.h"
#include "cobalt/cssom/resolution_value.h"
#include "cobalt/cssom/rgba_color_value.h"
#include "cobalt/cssom/shadow_value.h"
#include "cobalt/cssom/string_value.h"
#include "cobalt/cssom/time_list_value.h"
#include "cobalt/cssom/timing_function_list_value.h"
#include "cobalt/cssom/transform_function_list_value.h"
#include "cobalt/cssom/transform_matrix_function_value.h"
#include "cobalt/cssom/unicode_range_value.h"
#include "cobalt/cssom/url_src_value.h"
#include "cobalt/cssom/url_value.h"

namespace cobalt {
namespace cssom {

void DefaultingPropertyValueVisitor::VisitAbsoluteURL(
    AbsoluteURLValue* url_value) {
  VisitDefault(url_value);
}

void DefaultingPropertyValueVisitor::VisitCalc(CalcValue* calc_value) {
  VisitDefault(calc_value);
}

void DefaultingPropertyValueVisitor::VisitFilterFunctionList(
    FilterFunctionListValue* filter_function_list_value) {
  VisitDefault(filter_function_list_value);
}

void DefaultingPropertyValueVisitor::VisitFontStyle(
    FontStyleValue* font_style_value) {
  VisitDefault(font_style_value);
}

void DefaultingPropertyValueVisitor::VisitFontWeight(
    FontWeightValue* font_weight_value) {
  VisitDefault(font_weight_value);
}

void DefaultingPropertyValueVisitor::VisitInteger(
    IntegerValue* integer_value) {
  VisitDefault(integer_value);
}

void DefaultingPropertyValueVisitor::VisitKeyword(KeywordValue* keyword_value) {
  VisitDefault(keyword_value);
}

void DefaultingPropertyValueVisitor::VisitLength(LengthValue* length_value) {
  VisitDefault(length_value);
}

void DefaultingPropertyValueVisitor::VisitLinearGradient(
    LinearGradientValue* linear_gradient_value) {
  VisitDefault(linear_gradient_value);
}

void DefaultingPropertyValueVisitor::VisitLocalSrc(
    LocalSrcValue* local_src_value) {
  VisitDefault(local_src_value);
}

void DefaultingPropertyValueVisitor::VisitMediaFeatureKeywordValue(
    MediaFeatureKeywordValue* media_feature_keyword_value) {
  VisitDefault(media_feature_keyword_value);
}

void DefaultingPropertyValueVisitor::VisitNumber(NumberValue* number_value) {
  VisitDefault(number_value);
}

void DefaultingPropertyValueVisitor::VisitPercentage(
    PercentageValue* percentage_value) {
  VisitDefault(percentage_value);
}

void DefaultingPropertyValueVisitor::VisitPropertyKeyList(
    PropertyKeyListValue* property_key_list_value) {
  VisitDefault(property_key_list_value);
}

void DefaultingPropertyValueVisitor::VisitPropertyList(
    PropertyListValue* property_list_value) {
  VisitDefault(property_list_value);
}

void DefaultingPropertyValueVisitor::VisitRadialGradient(
    RadialGradientValue* radial_gradient_value) {
  VisitDefault(radial_gradient_value);
}

void DefaultingPropertyValueVisitor::VisitRatio(RatioValue* ratio_value) {
  VisitDefault(ratio_value);
}

void DefaultingPropertyValueVisitor::VisitResolution(
    ResolutionValue* resolution_value) {
  VisitDefault(resolution_value);
}

void DefaultingPropertyValueVisitor::VisitRGBAColor(
    RGBAColorValue* color_value) {
  VisitDefault(color_value);
}

void DefaultingPropertyValueVisitor::VisitShadow(ShadowValue* shadow_value) {
  VisitDefault(shadow_value);
}

void DefaultingPropertyValueVisitor::VisitString(StringValue* string_value) {
  VisitDefault(string_value);
}

void DefaultingPropertyValueVisitor::VisitTimeList(
    TimeListValue* time_list_value) {
  VisitDefault(time_list_value);
}

void DefaultingPropertyValueVisitor::VisitTimingFunctionList(
    TimingFunctionListValue* timing_function_list_value) {
  VisitDefault(timing_function_list_value);
}

void DefaultingPropertyValueVisitor::VisitTransformFunctionList(
    TransformFunctionListValue* transform_function_list_value) {
  VisitDefault(transform_function_list_value);
}

void DefaultingPropertyValueVisitor::VisitTransformMatrixFunction(
    TransformMatrixFunctionValue* transform_matrix_function_value) {
  VisitDefault(transform_matrix_function_value);
}

void DefaultingPropertyValueVisitor::VisitUnicodeRange(
    UnicodeRangeValue* unicode_range_value) {
  VisitDefault(unicode_range_value);
}

void DefaultingPropertyValueVisitor::VisitURL(URLValue* url_value) {
  VisitDefault(url_value);
}

void DefaultingPropertyValueVisitor::VisitUrlSrc(UrlSrcValue* url_src_value) {
  VisitDefault(url_src_value);
}

void NotReachedPropertyValueVisitor::VisitDefault(
    PropertyValue* property_value) {
  DLOG(ERROR) << "Unsupported property value: " << property_value->ToString();
  NOTREACHED();
}

}  // namespace cssom
}  // namespace cobalt
