From b50f1fffc8f63d25d0dc25b533ebb62089a69542 Mon Sep 17 00:00:00 2001 From: Igor Bogoslavskyi Date: Wed, 26 Jul 2023 00:41:16 +0200 Subject: [PATCH] Improve const correctness in the Screen class (#701) - Add a const variant to the accessor functions - Make Print and ToString functions const This fixes: https://github.com/ArthurSonzogni/FTXUI/issues/700 --- include/ftxui/screen/screen.hpp | 17 +++++++++------ src/ftxui/screen/screen.cpp | 37 ++++++++++++++++++++++++--------- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/include/ftxui/screen/screen.hpp b/include/ftxui/screen/screen.hpp index 68cb331..b444240 100644 --- a/include/ftxui/screen/screen.hpp +++ b/include/ftxui/screen/screen.hpp @@ -66,13 +66,18 @@ class Screen { static Screen Create(Dimensions dimension); static Screen Create(Dimensions width, Dimensions height); - // Node write into the screen using Screen::at. + // Access a character in the grid at a given position. std::string& at(int x, int y); - Pixel& PixelAt(int x, int y); + const std::string& at(int x, int y) const; - // Convert the screen into a printable string in the terminal. - std::string ToString(); - void Print(); + // Access a cell (Pixel) in the grid at a given position. + Pixel& PixelAt(int x, int y); + const Pixel& PixelAt(int x, int y) const; + + std::string ToString() const; + + // Print the Screen on to the terminal. + void Print() const; // Get screen dimensions. int dimx() const { return dimx_; } @@ -81,7 +86,7 @@ class Screen { // Move the terminal cursor n-lines up with n = dimy(). std::string ResetPosition(bool clear = false) const; - // Fill with space. + // Fill the screen with space. void Clear(); void ApplyShader(); diff --git a/src/ftxui/screen/screen.cpp b/src/ftxui/screen/screen.cpp index dd0570f..3eb5492 100644 --- a/src/ftxui/screen/screen.cpp +++ b/src/ftxui/screen/screen.cpp @@ -428,9 +428,11 @@ Screen::Screen(int dimx, int dimy) #endif } -/// Produce a std::string that can be used to print the Screen on the terminal. -/// Don't forget to flush stdout. Alternatively, you can use Screen::Print(); -std::string Screen::ToString() { +/// Produce a std::string that can be used to print the Screen on the +/// terminal. +/// @note Don't forget to flush stdout. Alternatively, you can use +/// Screen::Print(); +std::string Screen::ToString() const { std::stringstream ss; Pixel previous_pixel; @@ -456,24 +458,39 @@ std::string Screen::ToString() { return ss.str(); } -void Screen::Print() { +// Print the Screen to the terminal. +void Screen::Print() const { std::cout << ToString() << '\0' << std::flush; } -/// @brief Access a character a given position. -/// @param x The character position along the x-axis. -/// @param y The character position along the y-axis. +/// @brief Access a character in a cell at a given position. +/// @param x The cell position along the x-axis. +/// @param y The cell position along the y-axis. std::string& Screen::at(int x, int y) { return PixelAt(x, y).character; } -/// @brief Access a Pixel at a given position. -/// @param x The pixel position along the x-axis. -/// @param y The pixel position along the y-axis. +/// @brief Access a character in a cell at a given position. +/// @param x The cell position along the x-axis. +/// @param y The cell position along the y-axis. +const std::string& Screen::at(int x, int y) const { + return PixelAt(x, y).character; +} + +/// @brief Access a cell (Pixel) at a given position. +/// @param x The cell position along the x-axis. +/// @param y The cell position along the y-axis. Pixel& Screen::PixelAt(int x, int y) { return stencil.Contain(x, y) ? pixels_[y][x] : dev_null_pixel(); } +/// @brief Access a cell (Pixel) at a given position. +/// @param x The cell position along the x-axis. +/// @param y The cell position along the y-axis. +const Pixel& Screen::PixelAt(int x, int y) const { + return stencil.Contain(x, y) ? pixels_[y][x] : dev_null_pixel(); +} + /// @brief Return a string to be printed in order to reset the cursor position /// to the beginning of the screen. ///