// Copyright 2015 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.

#ifndef COBALT_WEB_ANIMATIONS_ANIMATION_SET_H_
#define COBALT_WEB_ANIMATIONS_ANIMATION_SET_H_

#include "cobalt/web_animations/animation_set.h"

#include <set>

#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "cobalt/cssom/property_definitions.h"
#include "cobalt/web_animations/animation.h"

namespace cobalt {
namespace web_animations {

// Defines a data structure to maintain a set of animations.  Creating a new
// custom class for this datastructure allows us to create many internal
// data structures to allow for efficient lookup of different data, such as
// acquiring the set of all properties affected.
class AnimationSet : public base::RefCounted<AnimationSet> {
 public:
  typedef std::set<Animation*> InternalSet;

  AnimationSet();

  void AddAnimation(Animation* animation);
  void RemoveAnimation(Animation* animation);

  bool IsEmpty() const { return animations_.empty(); }
  bool IsPropertyAnimated(cssom::PropertyKey property_name) const;

  int GetSize() const { return static_cast<int>(animations_.size()); }

  const InternalSet& animations() const { return animations_; }

 private:
  ~AnimationSet() {}

  InternalSet animations_;

  friend class base::RefCounted<AnimationSet>;

  DISALLOW_COPY_AND_ASSIGN(AnimationSet);
};

}  // namespace web_animations
}  // namespace cobalt

#endif  // COBALT_WEB_ANIMATIONS_ANIMATION_SET_H_
