153 lines
3.9 KiB
C++
153 lines
3.9 KiB
C++
// Copyright (c) 2020-present, Roland Munguia & Tristan Florian Bouchard.
|
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
|
|
|
#ifndef CSYS_HISTORY_H
|
|
#define CSYS_HISTORY_H
|
|
#pragma once
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
#include "csys/api.h"
|
|
|
|
namespace csys
|
|
{
|
|
class CSYS_API CommandHistory
|
|
{
|
|
public:
|
|
|
|
/*!
|
|
* \brief
|
|
* Command history constructor.
|
|
* \param maxRecord
|
|
* Maximum amount of command strings to keep track at once.
|
|
*/
|
|
explicit CommandHistory(unsigned int maxRecord = 100);
|
|
|
|
/*!
|
|
* \brief
|
|
* Move constructor
|
|
* \param rhs
|
|
* History to be copied.
|
|
*/
|
|
CommandHistory(CommandHistory &&rhs) = default;
|
|
|
|
/*!
|
|
* \brief
|
|
* Copy constructor
|
|
* \param rhs
|
|
* History to be copied.
|
|
*/
|
|
CommandHistory(const CommandHistory &rhs) = default;
|
|
|
|
/*!
|
|
* \brief
|
|
* Move assignment operator
|
|
* \param rhs
|
|
* History to be copied.
|
|
*/
|
|
CommandHistory &operator=(CommandHistory &&rhs) = default;
|
|
|
|
/*!
|
|
* \brief
|
|
* Copy assigment operator.
|
|
* \param rhs
|
|
* History to be copied.
|
|
*/
|
|
CommandHistory &operator=(const CommandHistory &rhs) = default;
|
|
|
|
/*!
|
|
* \brief
|
|
* Record command string. (Start at the beginning once end is reached).
|
|
* \param line
|
|
* Command string to be recorded.
|
|
*/
|
|
void PushBack(const std::string &line);
|
|
|
|
/*!
|
|
* \brief
|
|
* Get newest register command entry index
|
|
* \return
|
|
* Newest command entry index
|
|
*/
|
|
[[nodiscard]] unsigned int GetNewIndex() const;
|
|
|
|
/*!
|
|
* \brief
|
|
* Get newest register command entry
|
|
* \return
|
|
* Newest command entry
|
|
*/
|
|
const std::string &GetNew();
|
|
|
|
/*!
|
|
* \brief
|
|
* Get oldest register command entry index
|
|
* \return
|
|
* Oldest command entry index
|
|
*/
|
|
[[nodiscard]] unsigned int GetOldIndex() const;
|
|
|
|
/*!
|
|
* \brief
|
|
* Get oldest register command entry
|
|
* \return
|
|
* Oldest command entry string
|
|
*/
|
|
const std::string &GetOld();
|
|
|
|
/*!
|
|
* \brief Clear command history
|
|
*/
|
|
void Clear();
|
|
|
|
/*!
|
|
* \brief
|
|
* Retrieve command history at given index
|
|
* \param index
|
|
* Position to lookup in command history vector
|
|
* \return
|
|
* Command at given index
|
|
*
|
|
* \note
|
|
* No bound checking is performed when accessing with these index operator.
|
|
* Use the *index()* method for safe history vector indexing.
|
|
*/
|
|
const std::string &operator[](size_t index);
|
|
|
|
/*!
|
|
* \brief
|
|
* Output available command history.
|
|
* \param os
|
|
* Output stream
|
|
* \param history
|
|
* Reference to history to be printed
|
|
* \return
|
|
* Reference to history to be printed
|
|
*/
|
|
friend std::ostream &operator<<(std::ostream &os, const CommandHistory &history);
|
|
|
|
/*!
|
|
* \return
|
|
* Number of registered commands.
|
|
*/
|
|
size_t Size();
|
|
|
|
/*!
|
|
* \return
|
|
* Maximum commands that are able to be recorded
|
|
*/
|
|
size_t Capacity();
|
|
|
|
protected:
|
|
unsigned int m_Record; //!< Amount of commands recorded
|
|
unsigned int m_MaxRecord; //!< Maximum command record to keep track of
|
|
std::vector<std::string> m_History; //!< Console command history
|
|
};
|
|
}
|
|
|
|
#ifdef CSYS_HEADER_ONLY
|
|
#include "csys/history.inl"
|
|
#endif
|
|
|
|
#endif //CSYS_HISTORY_H
|