Sista
as a library is a collection of the following headers:
ANSI-Settings.hpp
: ANSI escape codes for terminal colors and stylesborder.hpp
: Bordercoordinates.hpp
: Coordinates manipulationcursor.hpp
: Cursor, clearScreenfield.hpp
: Fieldpawn.hpp
: Pawnsista.hpp
: main header file, includes all the others
Since v1.1.0 the library is divided in headers and implementation files. This fact isn't relevant in terms of importation, but it is in terms of compilation.
# Makefile for sista.cpp
IMPLEMENTATIONS = include/sista/ANSI-Settings.cpp include/sista/border.cpp include/sista/coordinates.cpp include/sista/cursor.cpp include/sista/field.cpp include/sista/pawn.cpp
all:
g++ -std=c++17 -Wall -g -c $(IMPLEMENTATIONS)
g++ -std=c++17 -Wall -g -c sista.cpp
g++ -std=c++17 -Wall -g -o sista sista.o ANSI-Settings.o border.o coordinates.o cursor.o pawn.o field.o
rm -f *.o
This header contains the following preprocessor constants:
Constant | Value | Description |
---|---|---|
CSI | "x1b[" | Command Sequence Introducer |
ESC | "x1b" | ESC |
CLS | "x1b[2J" | CLean Screen |
SSB | "x1b[3J" | Scroll Screen Buffer |
TL | "x1b[H" | Top Left |
HIDE_CURSOR | "x1b[?25l" | Hide Cursor |
SHOW_CURSOR | "x1b[?25h" | Show Cursor |
This header also contains the following functions:
void setForegroundColor(ForegroundColor);
void setBackgroundColor(BackgroundColor);
void setAttribute(Attribute);
void resetAttribute(Attribute);
void reset();
void setForegroundColor(unsigned short int, unsigned short int, unsigned short int);
void setBackgroundColor(unsigned short int, unsigned short int, unsigned short int);
void setForegroundColor(unsigned short int);
void setBackgroundColor(unsigned short int);
void setScreenMode(ScreenMode);
void unsetScreenMode(ScreenMode);
This header also contains the following enums based on the ANSI escape codes
enum ForegroundColor : int;
enum BackgroundColor : int;
enum Attribute : int;
enum ScreenMode : int;
This header also contains the following struct used to represent the style of a char in the terminal:
struct Settings {
ForegroundColor foregroundColor;
BackgroundColor backgroundColor;
Attribute attribute;
};
From this point all the elements of the library are part of the sista
namespace.
This header contains the following class used to represent the border of a field.
class Border {
protected:
char symbol; // Symbol of the Border
ANSI::Settings settings; // settings of the Border style
public:
Border(char, ANSI::Settings);
Border(char, ANSI::Settings&, bool);
virtual void print(bool apply_settings=true);
};
This header contains the following struct used to represent the coordinates of a Pawn.
struct Coordinates { // 2D coordinates
unsigned short y; // y coordinate
unsigned short x; // x coordinate
Coordinates();
Coordinates(unsigned short, unsigned short);
Coordinates(Coord);
bool operator==(const Coordinates&) const;
bool operator!=(const Coordinates&) const;
Coordinates operator+(const Coordinates&) const;
};
This header also contains the following typedef used to represent the coordinates of a Pawn.
typedef std::pair<unsigned short, unsigned short> Coord;
The library uses the Coordinate
struct more often than the Coord
typedef, but almost all the functions of the library can use both.
This header contains the following constants:
Constant | Value | Description |
---|---|---|
CHA | 'H' | Cursor Horizontal Absolute |
VPA | 'd' | Vertical Position Absolute |
This header also contains the following function.
void clearScreen();
This header also contains the following enums based on the ANSI escape codes
enum EraseScreen : int;
enum EraseLine : int;
enum MoveCursor : int;
enum MoveCursorDEC : int;
enum MoveCursorSCO : int;
This header also contains the following struct used to represent the cursor of the terminal.
struct Cursor {
unsigned short int x;
unsigned short int y;
Cursor();
~Cursor();
void set(unsigned short int, unsigned short int);
void set(sista::Coordinates);
void eraseScreen(EraseScreen);
void eraseLine(EraseLine);
void move(MoveCursor, unsigned short int);
void move(MoveCursorDEC);
void move(MoveCursorSCO);
};
The coordinates are 0-based like in the Coordinates
struct, they will be adapted to the {3, 2}-based coordinates of the terminal when printed.
This header contains the following constants:
Constant | Value | Description |
---|---|---|
PACMAN_EFFECT | 0 | Pacman effect |
MATRIX_EFFECT | 1 | Matrix effect |
This header also contains the following "abstract" class used to represent a field.
class Field {
protected:
std::vector<std::vector<Pawn*>> pawns; // Matrix of pawns
Cursor cursor; // Cursor
int width; // Width of the matrix
int height; // Height of the matrix
public:
Field(int, int);
~Field();
void clear();
void reset();
void print();
void print(char);
void print(Border&);
virtual void addPawn(Pawn*);
virtual void removePawn(Pawn*);
void addPrintPawn(Pawn*);
Pawn* getPawn(Coordinates&);
void movePawn(Pawn*, Coordinates&);
void movePawnBy(Pawn*, Coordinates&);
void movePawnBy(Pawn*, Coordinates&, bool);
void movePawnFromTo(Coordinates&, Coordinates&);
bool isOccupied(Coordinates&);
bool isOutOfBounds(Coordinates&);
bool isFree(Coordinates&);
void validateCoordinates(Coordinates&);
};
ℹ️ - All the methods with a Coordinates&
argument can use a Coord
typedef or two unsigned short
instead.
When using a SwappableField
, the movement of a Pawn
can be queued using a Path
object.
struct Path { // Path struct - begin and end Coordinates of a path
static int current_priority; // current_priority - priority of the current Path [counter]
int priority; // priority - priority of the Path (used in operator<)
Coordinates begin;
Coordinates end;
Pawn* pawn; // pawn - the pawn that is moving along the path
Path(Coordinates, Coordinates, Pawn*);
bool operator|(const Path& other) const;
bool operator<(const Path& other) const;
};
Then the SwappableField
class can be used to represent a field with some useful function to handle cell-conflicts.
class SwappableField: public Field {
private:
std::vector<std::vector<short int>> pawnsCount;
std::vector<Path> pawnsToSwap;
Coord firstInvalidCell(std::vector<std::vector<short int>>&);
public:
SwappableField(int, int);
~SwappableField();
void addPawn(Pawn*);
void removePawn(Pawn*);
void clearPawnsToSwap();
Coordinates movingByCoordinates(Pawn*, unsigned short, unsigned short);
Coordinates movingByCoordinates(Pawn*, unsigned short, unsigned short, bool);
void addPawnToSwap(Pawn*, Coordinates&);
void addPawnToSwap(Path&);
void applySwaps();
void swapTwoPawns(Coordinates&, Coordinates&);
void swapTwoPawns(Pawn*, Pawn*);
};
This header contains the following "abstract" class used to represent a pawn.
class Pawn {
protected:
char symbol;
Coordinates coordinates;
ANSI::Settings settings;
public:
Pawn(char, Coordinates, ANSI::Settings);
Pawn(char, Coordinates&, ANSI::Settings&, bool);
virtual ~Pawn();
virtual void print();
};
This header includes all the other headers.
#include "ANSI-Settings.hpp" // ANSI::ForegroundColor, ANSI::BackgroundColor, ANSI::Attribute, ANSI::Settings
#include "border.hpp" // Border
#include "coordinates.hpp" // Coord, Coordinates, <utility>
#include "pawn.hpp" // Pawn
#include "field.hpp" // Field, Path, SwappableField
#include "cursor.hpp" // Cursor, clearScreen [cross-platform since v0.6.0]