// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "cc/animation/animation_curve.h"

#include "base/logging.h"
#include "cc/animation/scroll_offset_animation_curve.h"

namespace cc {

const ColorAnimationCurve* AnimationCurve::ToColorAnimationCurve() const {
  DCHECK(Type() == AnimationCurve::COLOR);
  return static_cast<const ColorAnimationCurve*>(this);
}

AnimationCurve::CurveType ColorAnimationCurve::Type() const {
  return COLOR;
}

const FloatAnimationCurve* AnimationCurve::ToFloatAnimationCurve() const {
  DCHECK(Type() == AnimationCurve::FLOAT);
  return static_cast<const FloatAnimationCurve*>(this);
}

AnimationCurve::CurveType FloatAnimationCurve::Type() const {
  return FLOAT;
}

const TransformAnimationCurve* AnimationCurve::ToTransformAnimationCurve()
    const {
  DCHECK(Type() == AnimationCurve::TRANSFORM);
  return static_cast<const TransformAnimationCurve*>(this);
}

AnimationCurve::CurveType TransformAnimationCurve::Type() const {
  return TRANSFORM;
}

const FilterAnimationCurve* AnimationCurve::ToFilterAnimationCurve() const {
  DCHECK(Type() == AnimationCurve::FILTER);
  return static_cast<const FilterAnimationCurve*>(this);
}

AnimationCurve::CurveType FilterAnimationCurve::Type() const {
  return FILTER;
}

const ScrollOffsetAnimationCurve* AnimationCurve::ToScrollOffsetAnimationCurve()
    const {
  DCHECK(Type() == AnimationCurve::SCROLL_OFFSET);
  return static_cast<const ScrollOffsetAnimationCurve*>(this);
}

ScrollOffsetAnimationCurve* AnimationCurve::ToScrollOffsetAnimationCurve() {
  DCHECK(Type() == AnimationCurve::SCROLL_OFFSET);
  return static_cast<ScrollOffsetAnimationCurve*>(this);
}

}  // namespace cc
