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

#include "cobalt/web_animations/timed_task_queue.h"

namespace cobalt {
namespace web_animations {

TimedTaskQueue::TimedTaskQueue() {}

scoped_ptr<TimedTaskQueue::Task> TimedTaskQueue::QueueTask(
    base::TimeDelta fire_time, const base::Closure& task) {
  return make_scoped_ptr(new Task(this, fire_time, task));
}

void TimedTaskQueue::UpdateTime(base::TimeDelta time) {
  // Search through the list of tasks and fire each one whose time is now
  // in the past.  We use a while loop instead of a for loop so that we can
  // erase elements from the set as we go.
  while (!task_priority_queue_.empty() &&
         (*task_priority_queue_.begin())->fire_time() <= time) {
    Task* task = *task_priority_queue_.begin();
    DCHECK(!task->fired());
    RemoveTaskFromQueue(task);

    task->Fire();
  }
}

void TimedTaskQueue::Register(Task* task) {
  FireTimeSortedTaskList::iterator inserted = task_priority_queue_.insert(task);
  task_map_.insert(std::make_pair(task, inserted));
}

void TimedTaskQueue::Deregister(Task* task) {
  if (!task->fired()) {
    // If the task has not yet fired, we need to remove it from
    // task_priority_queue so that it is no longer queued to fire.
    RemoveTaskFromQueue(task);
  } else {
    // If the task has already been fired, then check that it has already been
    // removed from the queues and do nothing else.
    DCHECK(task_map_.find(task) == task_map_.end());
  }
}

void TimedTaskQueue::RemoveTaskFromQueue(Task* task) {
  TaskMap::iterator found = task_map_.find(task);
  DCHECK(found != task_map_.end());
  task_priority_queue_.erase(found->second);
  task_map_.erase(found);
}

}  // namespace web_animations
}  // namespace cobalt
