From b50f1fffc8f63d25d0dc25b533ebb62089a69542 Mon Sep 17 00:00:00 2001
From: Igor Bogoslavskyi <niosus@users.noreply.github.com>
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 | 15 ++++++++-----
 src/ftxui/screen/screen.cpp     | 37 ++++++++++++++++++++++++---------
 2 files changed, 37 insertions(+), 15 deletions(-)

diff --git a/include/ftxui/screen/screen.hpp b/include/ftxui/screen/screen.hpp
index 68cb331c..b4442407 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);
+  const std::string& at(int x, int y) const;
+
+  // 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;
 
-  // Convert the screen into a printable string in the terminal.
-  std::string ToString();
-  void Print();
+  // 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 dd0570f4..3eb5492d 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.
 ///
-- 
GitLab