From 1e1d30d70143d6f79f699e47a222d5efef6e2654 Mon Sep 17 00:00:00 2001 From: skynowa Date: Wed, 29 Apr 2026 00:31:46 +0300 Subject: [PATCH] AI-review: StdStream.inl (+5) [237+/101-] - review --- Print.h | 13 ++++ Print.inl | 23 ++++++- StdStream.h | 107 ++++++++++++++++++++++---------- StdStream.inl | 150 +++++++++++++++++++++++++-------------------- StdStream_Test.cpp | 45 ++++++++++++++ 5 files changed, 237 insertions(+), 101 deletions(-) diff --git a/Print.h b/Print.h index fe5e4fd..cd7dc21 100644 --- a/Print.h +++ b/Print.h @@ -6,6 +6,13 @@ #pragma once +//------------------------------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include //------------------------------------------------------------------------------------------------- namespace stdstream { @@ -49,6 +56,12 @@ class Print final template void _title(IteratorT first, IteratorT last); ///< contatiner title (name) + template + void _item(const ValueT &value); + ///< container item + template + void _item(const std::pair &value); + ///< std::pair item }; } // ns stdstream diff --git a/Print.inl b/Print.inl index 594461b..e1dcd06 100644 --- a/Print.inl +++ b/Print.inl @@ -44,11 +44,11 @@ Print::range( } _os << "{"; - _os << *a_first; + _item(*a_first); for (++ a_first; a_first != a_last; ++ a_first) { _os << _delimiter; - _os << *a_first; + _item(*a_first); } _os << "}"; @@ -87,6 +87,25 @@ Print::_title( _os << _contName << " (size=" << valueSize << "): "; } //------------------------------------------------------------------------------------------------- +template +inline void +Print::_item( + const ValueT &a_value ///< value +) +{ + _os << a_value; +} +//------------------------------------------------------------------------------------------------- +template +inline void +Print::_item( + const std::pair &a_value ///< value +) +{ + _os << typeNameDemangle(a_value) << ": "; + _os << "{" << a_value.first << "," << a_value.second << "}"; +} +//------------------------------------------------------------------------------------------------- template inline std::string Print::typeNameDemangle( diff --git a/StdStream.h b/StdStream.h index 4aed3c2..7d546af 100644 --- a/StdStream.h +++ b/StdStream.h @@ -7,6 +7,8 @@ #pragma once //------------------------------------------------------------------------------------------------- +#include +#include #include #include #include @@ -25,6 +27,49 @@ #include #include //------------------------------------------------------------------------------------------------- +namespace stdstream +{ + +template +class TracePtrValue final +{ +public: + explicit TracePtrValue(const T *ptr) : + _ptr {ptr} + { + } + + std::ostream & print(std::ostream &os) const + { + if (_ptr == nullptr) { + os << "nullptr"; + } else { + os << *_ptr; + } + + return os; + } + +private: + const T *_ptr {}; +}; + +template +TracePtrValue +tracePtrValue(const T *ptr) +{ + return TracePtrValue(ptr); +} + +template +std::ostream & +operator << (std::ostream &os, const TracePtrValue &value) +{ + return value.print(os); +} + +} // namespace stdstream +//------------------------------------------------------------------------------------------------- ///\name Trace variables (variable with value) ///\{ #define STD_TRACE_VAR(v1) \ @@ -61,7 +106,7 @@ #define STD_INVALID_VAR(v) \ "Invalid " << STD_TRACE_VAR(v) #define STD_TRACE_PTR(p) \ - #p ": " << "{" << (p) << ", " << ((p) ? *(p) : 0) << "}" + #p ": " << "{" << static_cast(p) << ", " << stdstream::tracePtrValue(p) << "}" #define STD_TITLE_VAR(v) \ "::::: " << (v) << " :::::" ///< trace variable as titlebar @@ -121,53 +166,53 @@ auto operator << (std::ostream &os, const T &value) -> decltype(value.print(os), template std::ostream & operator << (std::ostream &os, const std::pair &value); -template -std::ostream & operator << (std::ostream &os, const std::vector &value); +template +std::ostream & operator << (std::ostream &os, const std::vector &value); -template -std::ostream & operator << (std::ostream &os, const std::list &value); +template +std::ostream & operator << (std::ostream &os, const std::list &value); -template -std::ostream & operator << (std::ostream &os, const std::set &value); +template +std::ostream & operator << (std::ostream &os, const std::set &value); -template -std::ostream & operator << (std::ostream &os, const std::multiset &value); +template +std::ostream & operator << (std::ostream &os, const std::multiset &value); -template -std::ostream & operator << (std::ostream &os, const std::deque &value); +template +std::ostream & operator << (std::ostream &os, const std::deque &value); -template -std::ostream & operator << (std::ostream &os, const std::queue &value); +template +std::ostream & operator << (std::ostream &os, const std::queue &value); -template -std::ostream & operator << (std::ostream &os, const std::priority_queue &value); +template +std::ostream & operator << (std::ostream &os, const std::priority_queue &value); -template -std::ostream & operator << (std::ostream &os, const std::stack &value); +template +std::ostream & operator << (std::ostream &os, const std::stack &value); -template -std::ostream & operator << (std::ostream &os, const std::map &value); +template +std::ostream & operator << (std::ostream &os, const std::map &value); -template -std::ostream & operator << (std::ostream &os, const std::multimap &value); +template +std::ostream & operator << (std::ostream &os, const std::multimap &value); template std::ostream & operator << (std::ostream &os, const std::array &value); -template -std::ostream & operator << (std::ostream &os, const std::forward_list &value); +template +std::ostream & operator << (std::ostream &os, const std::forward_list &value); -template -std::ostream & operator << (std::ostream &os, const std::unordered_map &value); +template +std::ostream & operator << (std::ostream &os, const std::unordered_map &value); -template -std::ostream & operator << (std::ostream &os, const std::unordered_multimap &value); +template +std::ostream & operator << (std::ostream &os, const std::unordered_multimap &value); -template -std::ostream & operator << (std::ostream &os, const std::unordered_set &value); +template +std::ostream & operator << (std::ostream &os, const std::unordered_set &value); -template -std::ostream & operator << (std::ostream &os, const std::unordered_multiset &value); +template +std::ostream & operator << (std::ostream &os, const std::unordered_multiset &value); template std::ostream & operator << (std::ostream &os, const std::tuple &value); diff --git a/StdStream.inl b/StdStream.inl index 1dd04f0..b2d77a8 100644 --- a/StdStream.inl +++ b/StdStream.inl @@ -39,11 +39,11 @@ operator << ( return a_os; } //------------------------------------------------------------------------------------------------- -template +template inline std::ostream & operator << ( - std::ostream &a_os, - const std::vector &a_value + std::ostream &a_os, + const std::vector &a_value ) { /// stdstream::Print print("std::vector", ",", a_os); @@ -53,11 +53,11 @@ operator << ( return a_os; } //------------------------------------------------------------------------------------------------- -template +template inline std::ostream & operator << ( - std::ostream &a_os, - const std::list &a_value + std::ostream &a_os, + const std::list &a_value ) { /// stdstream::Print print("std::list", ",", a_os); @@ -67,11 +67,11 @@ operator << ( return a_os; } //------------------------------------------------------------------------------------------------- -template +template inline std::ostream & operator << ( - std::ostream &a_os, - const std::set &a_value + std::ostream &a_os, + const std::set &a_value ) { /// stdstream::Print print("std::set", ",", a_os); @@ -81,11 +81,11 @@ operator << ( return a_os; } //------------------------------------------------------------------------------------------------- -template +template inline std::ostream & operator << ( - std::ostream &a_os, - const std::multiset &a_value + std::ostream &a_os, + const std::multiset &a_value ) { /// stdstream::Print print("std::multiset", ",", a_os); @@ -95,11 +95,11 @@ operator << ( return a_os; } //------------------------------------------------------------------------------------------------- -template +template inline std::ostream & operator << ( - std::ostream &a_os, - const std::deque &a_value + std::ostream &a_os, + const std::deque &a_value ) { /// stdstream::Print print("std::deque", ",", a_os); @@ -109,68 +109,82 @@ operator << ( return a_os; } //------------------------------------------------------------------------------------------------- -template +template inline std::ostream & operator << ( - std::ostream &a_os, - const std::queue &a_value + std::ostream &a_os, + const std::queue &a_value ) { - using const_iterator = const T *; + std::vector values; + values.reserve(a_value.size()); - const_iterator it_cbegin = &a_value.front(); - const_iterator it_cend = &a_value.front() + a_value.size(); + auto copy = a_value; + while ( !copy.empty() ) { + values.push_back(copy.front()); + copy.pop(); + } - /// stdstream::Print print("std::queue", ",", a_os); - stdstream::Print print(stdstream::Print::typeNameDemangle(a_value), ",", a_os); - print.range(it_cbegin, it_cend); + /// stdstream::Print print("std::queue", ",", a_os); + stdstream::Print print(stdstream::Print::typeNameDemangle(a_value), ",", a_os); + print.container(values); return a_os; } //------------------------------------------------------------------------------------------------- -template +template inline std::ostream & operator << ( - std::ostream &a_os, - const std::priority_queue &a_value + std::ostream &a_os, + const std::priority_queue &a_value ) { - using const_iterator = const T *; + std::vector values; + values.reserve(a_value.size()); - const_iterator it_cbegin = &a_value.top(); - const_iterator it_cend = &a_value.top() + a_value.size(); + auto copy = a_value; + while ( !copy.empty() ) { + values.push_back(copy.top()); + copy.pop(); + } - /// stdstream::Print print("std::priority_queue", ",", a_os); - stdstream::Print print(stdstream::Print::typeNameDemangle(a_value), ",", a_os); - print.range(it_cbegin, it_cend); + /// stdstream::Print print("std::priority_queue", ",", a_os); + stdstream::Print print(stdstream::Print::typeNameDemangle(a_value), ",", a_os); + print.container(values); return a_os; } //------------------------------------------------------------------------------------------------- -template +template inline std::ostream & operator << ( - std::ostream &a_os, - const std::stack &a_value + std::ostream &a_os, + const std::stack &a_value ) { - using const_iterator = const T *; + std::vector values; + values.reserve(a_value.size()); - const_iterator it_cbegin = &a_value.top() - a_value.size() + 1; - const_iterator it_cend = &a_value.top() + 1; + auto copy = a_value; + while ( !copy.empty() ) { + values.push_back(copy.top()); + copy.pop(); + } - /// stdstream::Print print("std::stack", ",", a_os); - stdstream::Print print(stdstream::Print::typeNameDemangle(a_value), ",", a_os); - print.range(it_cbegin, it_cend); + std::reverse(values.begin(), values.end()); + + /// stdstream::Print print("std::stack", ",", a_os); + stdstream::Print print(stdstream::Print::typeNameDemangle(a_value), ",", a_os); + print.container(values); return a_os; } //------------------------------------------------------------------------------------------------- -template +template inline std::ostream & operator << ( - std::ostream &a_os, - const std::map &a_value + std::ostream &a_os, + const std::map &a_value ) { /// stdstream::Print print("std::map", "\n", a_os); @@ -180,11 +194,11 @@ operator << ( return a_os; } //------------------------------------------------------------------------------------------------- -template +template inline std::ostream & operator << ( - std::ostream &a_os, - const std::multimap &a_value + std::ostream &a_os, + const std::multimap &a_value ) { /// stdstream::Print print("std::multimap", "\n", a_os); @@ -208,11 +222,11 @@ operator << ( return a_os; } //------------------------------------------------------------------------------------------------- -template +template inline std::ostream & operator << ( - std::ostream &a_os, - const std::forward_list &a_value + std::ostream &a_os, + const std::forward_list &a_value ) { /// stdstream::Print print("std::forward_list", ",", a_os); @@ -222,11 +236,11 @@ operator << ( return a_os; } //------------------------------------------------------------------------------------------------- -template +template inline std::ostream & operator << ( - std::ostream &a_os, - const std::unordered_map &a_value + std::ostream &a_os, + const std::unordered_map &a_value ) { /// stdstream::Print print("std::unordered_map", "\n", a_os); @@ -236,11 +250,11 @@ operator << ( return a_os; } //------------------------------------------------------------------------------------------------- -template +template inline std::ostream & operator << ( - std::ostream &a_os, - const std::unordered_multimap &a_value + std::ostream &a_os, + const std::unordered_multimap &a_value ) { /// stdstream::Print print("std::unordered_multimap", "\n", a_os); @@ -250,11 +264,11 @@ operator << ( return a_os; } //------------------------------------------------------------------------------------------------- -template +template inline std::ostream & operator << ( - std::ostream &a_os, - const std::unordered_set &a_value + std::ostream &a_os, + const std::unordered_set &a_value ) { /// stdstream::Print print("std::unordered_set", ",", a_os); @@ -264,11 +278,11 @@ operator << ( return a_os; } //------------------------------------------------------------------------------------------------- -template +template inline std::ostream & operator << ( - std::ostream &a_os, - const std::unordered_multiset &a_value + std::ostream &a_os, + const std::unordered_multiset &a_value ) { /// stdstream::Print print("std::unordered_multiset", ",", a_os); @@ -312,15 +326,15 @@ operator << ( a_os << stdstream::Print::typeNameDemangle(a_value) << " (size=" << valueSize << "): "; // body - if (valueSize == 0) { + if constexpr (valueSize == 0) { a_os << "{}"; return a_os; + } else { + a_os << "{"; + TuplePrinter::print(a_os, a_value); + a_os << "}"; } - a_os << "{"; - TuplePrinter::print(a_os, a_value); - a_os << "}"; - return a_os; } //------------------------------------------------------------------------------------------------- diff --git a/StdStream_Test.cpp b/StdStream_Test.cpp index 8250296..9b076b1 100644 --- a/StdStream_Test.cpp +++ b/StdStream_Test.cpp @@ -22,6 +22,15 @@ int main(int, char **) std::cout << value << std::endl << std::endl; } + // std::queue with non-default container + { + std::queue> value; + value.push("aaa"); + value.push("bbb"); + value.push("ccc"); + std::cout << value << std::endl << std::endl; + } + // std::vector { std::vector value; @@ -31,6 +40,15 @@ int main(int, char **) std::cout << value << std::endl << std::endl; } + // std::stack with non-default container + { + std::stack> value; + value.push("aaa"); + value.push("bbb"); + value.push("ccc"); + std::cout << value << std::endl << std::endl; + } + // std::list { std::list value; @@ -109,6 +127,21 @@ int main(int, char **) std::cout << value << std::endl << std::endl; } + // std::unordered_map with custom hash + { + struct StringHash + { + std::size_t operator () (const std::string &value) const + { + return std::hash()(value); + } + }; + + std::unordered_map value; + value = {{"aaa", "000"}, {"bbb", "111"}}; + std::cout << value << std::endl << std::endl; + } + // std::map { std::map> value; @@ -190,6 +223,18 @@ int main(int, char **) std::cout << value << std::endl << std::endl; } + // std::tuple - empty + { + std::tuple<> value; + std::cout << value << std::endl << std::endl; + } + + // STD_TRACE_PTR - null non-arithmetic pointer + { + std::string *value {}; + std::cout << STD_TRACE_PTR(value) << std::endl << std::endl; + } + return EXIT_SUCCESS; } //-------------------------------------------------------------------------------------------------