// 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/trees/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
