Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions Print.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@

#pragma once

//-------------------------------------------------------------------------------------------------
#include <cstdlib>
#include <iterator>
#include <ostream>
#include <string>
#include <typeinfo>
#include <utility>
//-------------------------------------------------------------------------------------------------
namespace stdstream
{
Expand Down Expand Up @@ -49,6 +56,12 @@ class Print final
template<typename IteratorT>
void _title(IteratorT first, IteratorT last);
///< contatiner title (name)
template<typename ValueT>
void _item(const ValueT &value);
///< container item
template<typename T1, typename T2>
void _item(const std::pair<T1, T2> &value);
///< std::pair item
};

} // ns stdstream
Expand Down
23 changes: 21 additions & 2 deletions Print.inl
Original file line number Diff line number Diff line change
Expand Up @@ -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 << "}";
Expand Down Expand Up @@ -87,6 +87,25 @@ Print::_title(
_os << _contName << " (size=" << valueSize << "): ";
}
//-------------------------------------------------------------------------------------------------
template<typename ValueT>
inline void
Print::_item(
const ValueT &a_value ///< value
)
{
_os << a_value;
}
//-------------------------------------------------------------------------------------------------
template<typename T1, typename T2>
inline void
Print::_item(
const std::pair<T1, T2> &a_value ///< value
)
{
_os << typeNameDemangle(a_value) << ": ";
_os << "{" << a_value.first << "," << a_value.second << "}";
}
//-------------------------------------------------------------------------------------------------
template<typename T>
inline std::string
Print::typeNameDemangle(
Expand Down
107 changes: 76 additions & 31 deletions StdStream.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
#pragma once

//-------------------------------------------------------------------------------------------------
#include <cerrno>
#include <cstring>
#include <iostream>
#include <sstream>
#include <typeinfo>
Expand All @@ -25,6 +27,49 @@
#include <unordered_map>
#include <unordered_set>
//-------------------------------------------------------------------------------------------------
namespace stdstream
{

template<typename T>
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<typename T>
TracePtrValue<T>
tracePtrValue(const T *ptr)
{
return TracePtrValue<T>(ptr);
}

template<typename T>
std::ostream &
operator << (std::ostream &os, const TracePtrValue<T> &value)
{
return value.print(os);
}

} // namespace stdstream
//-------------------------------------------------------------------------------------------------
///\name Trace variables (variable with value)
///\{
#define STD_TRACE_VAR(v1) \
Expand Down Expand Up @@ -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<const void *>(p) << ", " << stdstream::tracePtrValue(p) << "}"
#define STD_TITLE_VAR(v) \
"::::: " << (v) << " :::::"
///< trace variable as titlebar
Expand Down Expand Up @@ -121,53 +166,53 @@ auto operator << (std::ostream &os, const T &value) -> decltype(value.print(os),
template<typename T1, typename T2>
std::ostream & operator << (std::ostream &os, const std::pair<T1, T2> &value);

template<typename T>
std::ostream & operator << (std::ostream &os, const std::vector<T> &value);
template<typename T, typename AllocT>
std::ostream & operator << (std::ostream &os, const std::vector<T, AllocT> &value);

template<typename T>
std::ostream & operator << (std::ostream &os, const std::list<T> &value);
template<typename T, typename AllocT>
std::ostream & operator << (std::ostream &os, const std::list<T, AllocT> &value);

template<typename T>
std::ostream & operator << (std::ostream &os, const std::set<T> &value);
template<typename T, typename CompareT, typename AllocT>
std::ostream & operator << (std::ostream &os, const std::set<T, CompareT, AllocT> &value);

template<typename T>
std::ostream & operator << (std::ostream &os, const std::multiset<T> &value);
template<typename T, typename CompareT, typename AllocT>
std::ostream & operator << (std::ostream &os, const std::multiset<T, CompareT, AllocT> &value);

template<typename T>
std::ostream & operator << (std::ostream &os, const std::deque<T> &value);
template<typename T, typename AllocT>
std::ostream & operator << (std::ostream &os, const std::deque<T, AllocT> &value);

template<typename T>
std::ostream & operator << (std::ostream &os, const std::queue<T> &value);
template<typename T, typename ContT>
std::ostream & operator << (std::ostream &os, const std::queue<T, ContT> &value);

template<typename T>
std::ostream & operator << (std::ostream &os, const std::priority_queue<T> &value);
template<typename T, typename ContT, typename CompareT>
std::ostream & operator << (std::ostream &os, const std::priority_queue<T, ContT, CompareT> &value);

template<typename T>
std::ostream & operator << (std::ostream &os, const std::stack<T> &value);
template<typename T, typename ContT>
std::ostream & operator << (std::ostream &os, const std::stack<T, ContT> &value);

template<typename T1, typename T2, class CompareT>
std::ostream & operator << (std::ostream &os, const std::map<T1, T2, CompareT> &value);
template<typename T1, typename T2, class CompareT, typename AllocT>
std::ostream & operator << (std::ostream &os, const std::map<T1, T2, CompareT, AllocT> &value);

template<typename T1, typename T2, class CompareT>
std::ostream & operator << (std::ostream &os, const std::multimap<T1, T2> &value);
template<typename T1, typename T2, class CompareT, typename AllocT>
std::ostream & operator << (std::ostream &os, const std::multimap<T1, T2, CompareT, AllocT> &value);

template<typename T, std::size_t N>
std::ostream & operator << (std::ostream &os, const std::array<T, N> &value);

template<typename T>
std::ostream & operator << (std::ostream &os, const std::forward_list<T> &value);
template<typename T, typename AllocT>
std::ostream & operator << (std::ostream &os, const std::forward_list<T, AllocT> &value);

template<typename T1, typename T2>
std::ostream & operator << (std::ostream &os, const std::unordered_map<T1, T2> &value);
template<typename T1, typename T2, typename HashT, typename KeyEqualT, typename AllocT>
std::ostream & operator << (std::ostream &os, const std::unordered_map<T1, T2, HashT, KeyEqualT, AllocT> &value);

template<typename T1, typename T2>
std::ostream & operator << (std::ostream &os, const std::unordered_multimap<T1, T2> &value);
template<typename T1, typename T2, typename HashT, typename KeyEqualT, typename AllocT>
std::ostream & operator << (std::ostream &os, const std::unordered_multimap<T1, T2, HashT, KeyEqualT, AllocT> &value);

template<typename T>
std::ostream & operator << (std::ostream &os, const std::unordered_set<T> &value);
template<typename T, typename HashT, typename KeyEqualT, typename AllocT>
std::ostream & operator << (std::ostream &os, const std::unordered_set<T, HashT, KeyEqualT, AllocT> &value);

template<typename T>
std::ostream & operator << (std::ostream &os, const std::unordered_multiset<T> &value);
template<typename T, typename HashT, typename KeyEqualT, typename AllocT>
std::ostream & operator << (std::ostream &os, const std::unordered_multiset<T, HashT, KeyEqualT, AllocT> &value);

template<typename... Args>
std::ostream & operator << (std::ostream &os, const std::tuple<Args...> &value);
Expand Down
Loading