/*
* Copyright (C) 2021 Christopher J. Howard
*
* This file is part of Antkeeper source code.
*
* Antkeeper source code is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Antkeeper source code is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Antkeeper source code. If not, see .
*/
#ifndef ANTKEEPER_TIMELINE_HPP
#define ANTKEEPER_TIMELINE_HPP
#include
#include
#include
/**
* Timeline which executes cues (scheduled functions) when advanced over their respective positions in time.
*/
class timeline
{
public:
/// Scheduled function consisting of a time and function object.
typedef std::tuple> cue;
/// List of cues.
typedef std::list sequence;
/**
* Creates a timeline.
*/
timeline();
/**
* Advances the timeline position (t) by @p dt, triggering any cues scheduled between `t` and `dt`. If autoremove is enabled, triggered cues will be removed.
*
* @param dt Delta time by which the timeline position will be advanced.
*/
void advance(float dt);
/**
* Sets the timeline position to @p t.
*
* @param t Position in time to which the timeline position will be set.
*/
void seek(float t);
/**
* Adds a cue to the timeline.
*
* @param c Cue to add.
*/
void add_cue(const cue& c);
/**
* Removes a cue from the timeline. If there are multiple identical cues (same time and function), they will all be removed.
*
* @param c Cue to remove.
*/
void remove_cue(const cue& c);
/**
* Removes all cues on `[start, end)`.
*
* @param start Starting position in time (inclusive).
* @param end Ending position in time (non-inclusive).
*/
void remove_cues(float start, float end);
/**
* Adds a sequence of cues to the timeline.
*
* @param s Sequence of cues to add.
*/
void add_sequence(const sequence& s);
/**
* Removes a sequence of cues from the timeline.
*
* @param s Sequence of cues to remove.
*/
void remove_sequence(const sequence& s);
/**
* Removes all cues from the timeline.
*/
void clear();
/**
* If enabled, cues will be automatically removed from the timeline when they are triggered.
*
* @param enabled Whether to enable autoremove.
*/
void set_autoremove(bool enabled);
/**
* Returns the current position in time on the timeline.
*/
float get_position() const;
/**
* Returns all the cues on `[start, end)`.
*
* @param start Starting position in time (inclusive).
* @param end Ending position in time (non-inclusive).
* @return All cues on `[start, end)`.
*/
sequence get_cues(float start, float end) const;
private:
std::multiset> cues;
float position;
bool autoremove;
};
inline float timeline::get_position() const
{
return position;
}
#endif // ANTKEEPER_TIMELINE_HPP