| // Copyright 2016 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 "core/animation/UnderlyingValueOwner.h" |
| |
| #include <memory> |
| |
| namespace blink { |
| |
| struct NullValueWrapper { |
| NullValueWrapper() : value(nullptr) {} |
| const InterpolationValue value; |
| }; |
| |
| const InterpolationValue& UnderlyingValueOwner::value() const { |
| DEFINE_STATIC_LOCAL(NullValueWrapper, nullValueWrapper, ()); |
| return *this ? *m_value : nullValueWrapper.value; |
| } |
| |
| void UnderlyingValueOwner::set(std::nullptr_t) { |
| m_type = nullptr; |
| m_valueOwner.clear(); |
| m_value = nullptr; |
| } |
| |
| void UnderlyingValueOwner::set(const InterpolationType& type, |
| const InterpolationValue& value) { |
| DCHECK(value); |
| m_type = &type; |
| // By clearing m_valueOwner we will perform a copy before attempting to mutate |
| // m_value, thus upholding the const contract for this instance of |
| // interpolationValue. |
| m_valueOwner.clear(); |
| m_value = &value; |
| } |
| |
| void UnderlyingValueOwner::set(const InterpolationType& type, |
| InterpolationValue&& value) { |
| DCHECK(value); |
| m_type = &type; |
| m_valueOwner = std::move(value); |
| m_value = &m_valueOwner; |
| } |
| |
| void UnderlyingValueOwner::set(std::unique_ptr<TypedInterpolationValue> value) { |
| if (value) |
| set(value->type(), std::move(value->mutableValue())); |
| else |
| set(nullptr); |
| } |
| |
| void UnderlyingValueOwner::set(const TypedInterpolationValue* value) { |
| if (value) |
| set(value->type(), value->value()); |
| else |
| set(nullptr); |
| } |
| |
| InterpolationValue& UnderlyingValueOwner::mutableValue() { |
| DCHECK(m_type && m_value); |
| if (!m_valueOwner) { |
| m_valueOwner = m_value->clone(); |
| m_value = &m_valueOwner; |
| } |
| return m_valueOwner; |
| } |
| |
| } // namespace blink |