// 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 "cc/animation/property_animation_state.h"

#include "base/logging.h"

namespace cc {

PropertyAnimationState::PropertyAnimationState() {}

PropertyAnimationState::PropertyAnimationState(
    const PropertyAnimationState& rhs)
    : currently_running(rhs.currently_running),
      potentially_animating(rhs.potentially_animating) {}

PropertyAnimationState::~PropertyAnimationState() {}

bool PropertyAnimationState::operator==(
    const PropertyAnimationState& other) const {
  return currently_running == other.currently_running &&
         potentially_animating == other.potentially_animating;
}

bool PropertyAnimationState::operator!=(
    const PropertyAnimationState& other) const {
  return !operator==(other);
}

PropertyAnimationState& PropertyAnimationState::operator|=(
    const PropertyAnimationState& other) {
  currently_running |= other.currently_running;
  potentially_animating |= other.potentially_animating;

  return *this;
}

PropertyAnimationState& PropertyAnimationState::operator^=(
    const PropertyAnimationState& other) {
  currently_running ^= other.currently_running;
  potentially_animating ^= other.potentially_animating;

  return *this;
}

PropertyAnimationState& PropertyAnimationState::operator&=(
    const PropertyAnimationState& other) {
  currently_running &= other.currently_running;
  potentially_animating &= other.potentially_animating;

  return *this;
}

PropertyAnimationState operator^(const PropertyAnimationState& lhs,
                                 const PropertyAnimationState& rhs) {
  PropertyAnimationState result = lhs;
  result ^= rhs;
  return result;
}

bool PropertyAnimationState::IsValid() const {
  // currently_running must be a subset for potentially_animating.
  // currently <= potentially i.e. potentially || !currently.
  TargetProperties result = potentially_animating | ~currently_running;
  return result.all();
}

void PropertyAnimationState::Clear() {
  currently_running.reset();
  potentially_animating.reset();
}

}  // namespace cc
