self-review

helped by Copilot
This commit is contained in:
Laurent Rineau 2025-10-29 17:34:57 +01:00
parent 73b8e65b5a
commit 27edd158c1
4 changed files with 124 additions and 69 deletions

View File

@ -65,9 +65,22 @@ the printing mode.
\cgalCRPSection{Enum} \cgalCRPSection{Enum}
- \link PkgStreamSupportEnumRef `CGAL::IO::Mode` \endlink - \link PkgStreamSupportEnumRef `CGAL::IO::Mode` \endlink
- `CGAL::IO::Ansi_color`
\cgalCRPSection{Classes} \cgalCRPSection{Classes}
- `CGAL::IO::Color` - `CGAL::IO::Color`
- `CGAL::IO::Basic_color_streambuf<CharT,Traits>`
- `CGAL::IO::Color_streambuf`
- `CGAL::IO::Color_wstreambuf`
- `CGAL::IO::Basic_color_stream_guard<StreamT>`
- `CGAL::IO::Color_stream_guard`
- `CGAL::IO::Color_wstream_guard`
- `CGAL::IO::Basic_indenting_streambuf<CharT,Traits>`
- `CGAL::IO::Indenting_streambuf`
- `CGAL::IO::Indenting_wstreambuf`
- `CGAL::IO::Basic_indenting_stream_guard<StreamT>`
- `CGAL::IO::Indenting_stream_guard`
- `CGAL::IO::Indenting_wstream_guard`
- `CGAL::Istream_iterator<T,Stream>` - `CGAL::Istream_iterator<T,Stream>`
- `CGAL::Ostream_iterator<T,Stream>` - `CGAL::Ostream_iterator<T,Stream>`
- `CGAL::Verbose_ostream` - `CGAL::Verbose_ostream`
@ -75,6 +88,9 @@ the printing mode.
- `CGAL::Output_rep<T,F>` - `CGAL::Output_rep<T,F>`
\cgalCRPSection{Functions} \cgalCRPSection{Functions}
- `CGAL::IO::make_color_guards()`
- `CGAL::IO::stream_supports_color()`
- `CGAL::IO::make_indenting_guards()`
- `CGAL::IO::get_mode()` - `CGAL::IO::get_mode()`
- `CGAL::IO::is_ascii()` - `CGAL::IO::is_ascii()`
- `CGAL::IO::is_binary()` - `CGAL::IO::is_binary()`

View File

@ -1,4 +1,6 @@
/*! /*!
\example Stream_support/color_ostream.cpp
\example Stream_support/indenting_ostream.cpp
\example Stream_support/Linestring_WKT.cpp \example Stream_support/Linestring_WKT.cpp
\example Stream_support/Point_WKT.cpp \example Stream_support/Point_WKT.cpp
\example Stream_support/Polygon_WKT.cpp \example Stream_support/Polygon_WKT.cpp

View File

@ -13,6 +13,8 @@
// //
// //
// Author(s) : Laurent Rineau // Author(s) : Laurent Rineau
//
// Documentation partially generated by Github Copilot
#ifndef CGAL_IO_COLOR_OSTREAM_H #ifndef CGAL_IO_COLOR_OSTREAM_H
#define CGAL_IO_COLOR_OSTREAM_H #define CGAL_IO_COLOR_OSTREAM_H
@ -39,6 +41,7 @@
#endif #endif
#if defined(__STDC_LIB_EXT1__) && defined(_WIN32) #if defined(__STDC_LIB_EXT1__) && defined(_WIN32)
# include <array>
# include <stdlib.h> // for getenv_s # include <stdlib.h> // for getenv_s
# define CGAL_USE_GETENV_S 1 # define CGAL_USE_GETENV_S 1
#endif #endif
@ -47,58 +50,58 @@ namespace CGAL {
namespace IO { namespace IO {
/** /**
* \ingroup PkgStreamSupportRef * \ingroup PkgStreamSupportEnumRef
* *
* ANSI color codes for terminal output. * ANSI color codes for terminal output.
*/ */
enum class Ansi_color { enum class Ansi_color {
Reset = 0, Reset = 0, ///< Reset all attributes to default
Bold = 1, Bold = 1, ///< Bold or increased intensity
Dim = 2, Dim = 2, ///< Faint or decreased intensity
Underline = 4, Underline = 4, ///< Underlined text
Blink = 5, Blink = 5, ///< Blinking text
Reverse = 7, Reverse = 7, ///< Swap foreground and background colors
Hidden = 8, Hidden = 8, ///< Hidden or invisible text
// Foreground colors // Foreground colors
Black = 30, Black = 30, ///< Black foreground color
Red = 31, Red = 31, ///< Red foreground color
Green = 32, Green = 32, ///< Green foreground color
Yellow = 33, Yellow = 33, ///< Yellow foreground color
Blue = 34, Blue = 34, ///< Blue foreground color
Magenta = 35, Magenta = 35, ///< Magenta foreground color
Cyan = 36, Cyan = 36, ///< Cyan foreground color
White = 37, White = 37, ///< White foreground color
// Bright foreground colors // Bright foreground colors
BrightBlack = 90, BrightBlack = 90, ///< Bright black (gray) foreground color
BrightRed = 91, BrightRed = 91, ///< Bright red foreground color
BrightGreen = 92, BrightGreen = 92, ///< Bright green foreground color
BrightYellow = 93, BrightYellow = 93, ///< Bright yellow foreground color
BrightBlue = 94, BrightBlue = 94, ///< Bright blue foreground color
BrightMagenta = 95, BrightMagenta = 95, ///< Bright magenta foreground color
BrightCyan = 96, BrightCyan = 96, ///< Bright cyan foreground color
BrightWhite = 97, BrightWhite = 97, ///< Bright white foreground color
// Background colors // Background colors
BgBlack = 40, BgBlack = 40, ///< Black background color
BgRed = 41, BgRed = 41, ///< Red background color
BgGreen = 42, BgGreen = 42, ///< Green background color
BgYellow = 43, BgYellow = 43, ///< Yellow background color
BgBlue = 44, BgBlue = 44, ///< Blue background color
BgMagenta = 45, BgMagenta = 45, ///< Magenta background color
BgCyan = 46, BgCyan = 46, ///< Cyan background color
BgWhite = 47, BgWhite = 47, ///< White background color
// Bright background colors // Bright background colors
BgBrightBlack = 100, BgBrightBlack = 100, ///< Bright black (gray) background color
BgBrightRed = 101, BgBrightRed = 101, ///< Bright red background color
BgBrightGreen = 102, BgBrightGreen = 102, ///< Bright green background color
BgBrightYellow = 103, BgBrightYellow = 103, ///< Bright yellow background color
BgBrightBlue = 104, BgBrightBlue = 104, ///< Bright blue background color
BgBrightMagenta = 105, BgBrightMagenta = 105, ///< Bright magenta background color
BgBrightCyan = 106, BgBrightCyan = 106, ///< Bright cyan background color
BgBrightWhite = 107 BgBrightWhite = 107 ///< Bright white background color
}; };
/** /**
@ -110,18 +113,21 @@ enum class Ansi_color {
* *
* \tparam CharT Character type (typically `char` or `wchar_t`) * \tparam CharT Character type (typically `char` or `wchar_t`)
* \tparam Traits Character traits type * \tparam Traits Character traits type
*
* \sa Basic_color_stream_guard
* \sa make_color_guards
*/ */
template <typename CharT, typename Traits = std::char_traits<CharT>> template <typename CharT, typename Traits = std::char_traits<CharT>>
class Basic_color_streambuf : public std::basic_streambuf<CharT, Traits>, protected Traits class Basic_color_streambuf : public std::basic_streambuf<CharT, Traits>, protected Traits
{ {
public: public:
using char_type = CharT; using char_type = CharT; ///< Character type
using traits_type = Traits; using traits_type = Traits; ///< Character traits type
using int_type = typename traits_type::int_type; using int_type = typename traits_type::int_type; ///< Integer type for character representation
using pos_type = typename traits_type::pos_type; using pos_type = typename traits_type::pos_type; ///< Position type for stream positioning
using off_type = typename traits_type::off_type; using off_type = typename traits_type::off_type; ///< Offset type for stream positioning
using streambuf_type = std::basic_streambuf<char_type, traits_type>; using streambuf_type = std::basic_streambuf<char_type, traits_type>; ///< Type of the wrapped streambuf
using string = std::basic_string<char_type>; using string = std::basic_string<char_type>; ///< String type matching character type
private: private:
streambuf_type* wrapped_buf_; streambuf_type* wrapped_buf_;
@ -425,9 +431,11 @@ protected:
} }
}; };
/// \ingroup PkgStreamSupportRef
/// Type alias for `Basic_color_streambuf<char>` /// Type alias for `Basic_color_streambuf<char>`
using Color_streambuf = Basic_color_streambuf<char>; using Color_streambuf = Basic_color_streambuf<char>;
/// \ingroup PkgStreamSupportRef
/// Type alias for `Basic_color_streambuf<wchar_t>` /// Type alias for `Basic_color_streambuf<wchar_t>`
using Color_wstreambuf = Basic_color_streambuf<wchar_t>; using Color_wstreambuf = Basic_color_streambuf<wchar_t>;
@ -440,16 +448,20 @@ using Color_wstreambuf = Basic_color_streambuf<wchar_t>;
* It provides a convenient way to add colors to output streams within a specific scope. * It provides a convenient way to add colors to output streams within a specific scope.
* *
* \tparam StreamT The stream type (e.g., `std::ostream`, `std::wostream`) * \tparam StreamT The stream type (e.g., `std::ostream`, `std::wostream`)
*
* \sa Basic_color_streambuf
* \sa make_color_guards
*/ */
template <typename StreamT> template <typename StreamT>
class Basic_color_stream_guard class Basic_color_stream_guard
{ {
public:
using char_type = typename StreamT::char_type; ///< Character type
using traits_type = typename StreamT::traits_type; ///< Character traits type
using streambuf_type = Basic_color_streambuf<char_type, traits_type>; ///< Type of the color streambuf
using wrapped_streambuf_type = std::basic_streambuf<char_type, traits_type>; ///< Type of the wrapped streambuf
using string = std::basic_string<char_type>; ///< String type matching character type
private: private:
using char_type = typename StreamT::char_type;
using traits_type = typename StreamT::traits_type;
using streambuf_type = Basic_color_streambuf<char_type, traits_type>;
using wrapped_streambuf_type = std::basic_streambuf<char_type, traits_type>;
using string = std::basic_string<char_type>;
StreamT& stream_; StreamT& stream_;
wrapped_streambuf_type* original_buf_; wrapped_streambuf_type* original_buf_;
string original_color_code_; string original_color_code_;
@ -526,9 +538,11 @@ public:
} }
}; };
/// \ingroup PkgStreamSupportRef
/// Type alias for `Basic_color_stream_guard<std::ostream>` /// Type alias for `Basic_color_stream_guard<std::ostream>`
using Color_stream_guard = Basic_color_stream_guard<std::ostream>; using Color_stream_guard = Basic_color_stream_guard<std::ostream>;
/// \ingroup PkgStreamSupportRef
/// Type alias for `Basic_color_stream_guard<std::wostream>` /// Type alias for `Basic_color_stream_guard<std::wostream>`
using Color_wstream_guard = Basic_color_stream_guard<std::wostream>; using Color_wstream_guard = Basic_color_stream_guard<std::wostream>;
@ -547,9 +561,11 @@ using Color_wstream_guard = Basic_color_stream_guard<std::wostream>;
* \param streams The streams to apply colors to * \param streams The streams to apply colors to
* \return A tuple of Basic_color_stream_guard objects * \return A tuple of Basic_color_stream_guard objects
* *
* \sa Basic_color_stream_guard
*
* Example usage: * Example usage:
* \code * \code
* auto guards = CGAL::make_color_guards(Color::Red, std::cout, std::cerr); * auto guards = CGAL::IO::make_color_guards(CGAL::IO::Ansi_color::Red, std::cout, std::cerr);
* std::cout << "Red output\n"; * std::cout << "Red output\n";
* std::cerr << "Red error\n"; * std::cerr << "Red error\n";
* \endcode * \endcode
@ -570,6 +586,8 @@ auto make_color_guards(Ansi_color color, Streams&... streams) {
* \param colors Vector of colors to combine * \param colors Vector of colors to combine
* \param streams The streams to apply colors to * \param streams The streams to apply colors to
* \return A tuple of Basic_color_stream_guard objects * \return A tuple of Basic_color_stream_guard objects
*
* \sa Basic_color_stream_guard
*/ */
template <typename... Streams> template <typename... Streams>
auto make_color_guards(const std::vector<Ansi_color>& colors, Streams&... streams) { auto make_color_guards(const std::vector<Ansi_color>& colors, Streams&... streams) {
@ -587,7 +605,7 @@ auto make_color_guards(const std::vector<Ansi_color>& colors, Streams&... stream
* 1. Verifies the stream is attached to a TTY device using `isatty()` * 1. Verifies the stream is attached to a TTY device using `isatty()`
* 2. Checks if the `TERM` environment variable indicates color support * 2. Checks if the `TERM` environment variable indicates color support
* 3. Respects the `NO_COLOR` environment variable (if set, colors are disabled) * 3. Respects the `NO_COLOR` environment variable (if set, colors are disabled)
* 4. On Windows, also checks for `ANSICON` environment variable * 4. Respects the `CLICOLOR_FORCE` environment variable (if set, colors are enabled)
* *
* \param stream The output stream to check (e.g., `std::cout`, `std::cerr`) * \param stream The output stream to check (e.g., `std::cout`, `std::cerr`)
* \return `true` if the stream supports color output, `false` otherwise * \return `true` if the stream supports color output, `false` otherwise
@ -596,10 +614,12 @@ auto make_color_guards(const std::vector<Ansi_color>& colors, Streams&... stream
* never return false positives (it won't report color support where * never return false positives (it won't report color support where
* it doesn't exist). * it doesn't exist).
* *
* \sa Basic_color_streambuf
*
* Example usage: * Example usage:
* \code * \code
* if(CGAL::stream_supports_color(std::cout)) { * if(CGAL::IO::stream_supports_color(std::cout)) {
* CGAL::Color_stream_guard guard(std::cout, CGAL::Ansi_color::Red); * CGAL::IO::Color_stream_guard guard(std::cout, CGAL::IO::Ansi_color::Red);
* std::cout << "This text is red!\n"; * std::cout << "This text is red!\n";
* } else { * } else {
* std::cout << "Plain text output\n"; * std::cout << "Plain text output\n";

View File

@ -13,6 +13,8 @@
// //
// //
// Author(s) : Laurent Rineau // Author(s) : Laurent Rineau
//
// Documentation partially generated by Github Copilot
#ifndef CGAL_IO_INDENTING_OSTREAM_H #ifndef CGAL_IO_INDENTING_OSTREAM_H
#define CGAL_IO_INDENTING_OSTREAM_H #define CGAL_IO_INDENTING_OSTREAM_H
@ -36,18 +38,21 @@ namespace IO {
* *
* \tparam CharT Character type (typically `char` or `wchar_t`) * \tparam CharT Character type (typically `char` or `wchar_t`)
* \tparam Traits Character traits type * \tparam Traits Character traits type
*
* \sa Basic_indenting_stream_guard
* \sa make_indenting_guards
*/ */
template <typename CharT, typename Traits = std::char_traits<CharT>> template <typename CharT, typename Traits = std::char_traits<CharT>>
class Basic_indenting_streambuf : public std::basic_streambuf<CharT, Traits>, protected Traits class Basic_indenting_streambuf : public std::basic_streambuf<CharT, Traits>, protected Traits
{ {
public: public:
using char_type = CharT; using char_type = CharT; ///< Character type
using traits_type = Traits; using traits_type = Traits; ///< Character traits type
using int_type = typename traits_type::int_type; using int_type = typename traits_type::int_type; ///< Integer type for character representation
using pos_type = typename traits_type::pos_type; using pos_type = typename traits_type::pos_type; ///< Position type for stream positioning
using off_type = typename traits_type::off_type; using off_type = typename traits_type::off_type; ///< Offset type for stream positioning
using streambuf_type = std::basic_streambuf<char_type, traits_type>; using streambuf_type = std::basic_streambuf<char_type, traits_type>; ///< Type of the wrapped streambuf
using string = std::basic_string<char_type>; using string = std::basic_string<char_type>; ///< String type matching character type
private: private:
streambuf_type* wrapped_buf_; streambuf_type* wrapped_buf_;
@ -180,9 +185,11 @@ protected:
} }
}; };
/// \ingroup PkgStreamSupportRef
/// Type alias for `Basic_indenting_streambuf<char>` /// Type alias for `Basic_indenting_streambuf<char>`
using Indenting_streambuf = Basic_indenting_streambuf<char>; using Indenting_streambuf = Basic_indenting_streambuf<char>;
/// \ingroup PkgStreamSupportRef
/// Type alias for `Basic_indenting_streambuf<wchar_t>` /// Type alias for `Basic_indenting_streambuf<wchar_t>`
using Indenting_wstreambuf = Basic_indenting_streambuf<wchar_t>; using Indenting_wstreambuf = Basic_indenting_streambuf<wchar_t>;
@ -195,16 +202,20 @@ using Indenting_wstreambuf = Basic_indenting_streambuf<wchar_t>;
* It provides a convenient way to add indentation to output streams within a specific scope. * It provides a convenient way to add indentation to output streams within a specific scope.
* *
* \tparam StreamT The stream type (e.g., `std::ostream`, `std::wostream`) * \tparam StreamT The stream type (e.g., `std::ostream`, `std::wostream`)
*
* \sa Basic_indenting_streambuf
* \sa make_indenting_guards
*/ */
template <typename StreamT> template <typename StreamT>
class Basic_indenting_stream_guard class Basic_indenting_stream_guard
{ {
public:
using char_type = typename StreamT::char_type; ///< Character type
using traits_type = typename StreamT::traits_type; ///< Character traits type
using streambuf_type = Basic_indenting_streambuf<char_type, traits_type>; ///< Type of the indenting streambuf
using wrapped_streambuf_type = std::basic_streambuf<char_type, traits_type>; ///< Type of the wrapped streambuf
using string = std::basic_string<char_type>; ///< String type matching character type
private: private:
using char_type = typename StreamT::char_type;
using traits_type = typename StreamT::traits_type;
using streambuf_type = Basic_indenting_streambuf<char_type, traits_type>;
using wrapped_streambuf_type = std::basic_streambuf<char_type, traits_type>;
using string = std::basic_string<char_type>;
StreamT& stream_; StreamT& stream_;
wrapped_streambuf_type* original_buf_; wrapped_streambuf_type* original_buf_;
string original_indent_string_; string original_indent_string_;
@ -273,9 +284,11 @@ public:
} }
}; };
/// \ingroup PkgStreamSupportRef
/// Type alias for `basic_indenting_stream_guard<std::ostream>` /// Type alias for `basic_indenting_stream_guard<std::ostream>`
using Indenting_stream_guard = Basic_indenting_stream_guard<std::ostream>; using Indenting_stream_guard = Basic_indenting_stream_guard<std::ostream>;
/// \ingroup PkgStreamSupportRef
/// Type alias for `basic_indenting_stream_guard<std::wostream>` /// Type alias for `basic_indenting_stream_guard<std::wostream>`
using Indenting_wstream_guard = Basic_indenting_stream_guard<std::wostream>; using Indenting_wstream_guard = Basic_indenting_stream_guard<std::wostream>;
@ -294,9 +307,11 @@ using Indenting_wstream_guard = Basic_indenting_stream_guard<std::wostream>;
* \param streams The streams to apply indentation to * \param streams The streams to apply indentation to
* \return A tuple of Basic_indenting_stream_guard objects * \return A tuple of Basic_indenting_stream_guard objects
* *
* \sa Basic_indenting_stream_guard
*
* Example usage: * Example usage:
* \code * \code
* auto guards = CGAL::make_indenting_guards(2, std::cout, std::cerr); * auto guards = CGAL::IO::make_indenting_guards(2, std::cout, std::cerr);
* std::cout << "Indented output\n"; * std::cout << "Indented output\n";
* std::cerr << "Indented error\n"; * std::cerr << "Indented error\n";
* \endcode * \endcode
@ -318,6 +333,8 @@ auto make_indenting_guards(int spaces_per_level, Streams&... streams) {
* \param indent_string The indentation string to use * \param indent_string The indentation string to use
* \param streams The streams to apply indentation to * \param streams The streams to apply indentation to
* \return A tuple of Basic_indenting_stream_guard objects * \return A tuple of Basic_indenting_stream_guard objects
*
* \sa Basic_indenting_stream_guard
*/ */
template <typename... Streams> template <typename... Streams>
auto make_indenting_guards(const std::string& indent_string, Streams&... streams) { auto make_indenting_guards(const std::string& indent_string, Streams&... streams) {