All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
ostreamMethods.h
Go to the documentation of this file.
1//
2// Copyright 2016 Pixar
3//
4// Licensed under the terms set forth in the LICENSE.txt file available at
5// https://openusd.org/license.
6//
7#ifndef PXR_BASE_TF_OSTREAM_METHODS_H
8#define PXR_BASE_TF_OSTREAM_METHODS_H
9
23
24#include "pxr/pxr.h"
25#include "pxr/base/tf/hashmap.h"
27
28#include <ostream>
29#include <vector>
30#include <list>
31#include <map>
32#include <set>
33#include <type_traits>
34#include <utility>
35
36PXR_NAMESPACE_OPEN_SCOPE
37
38template <class T>
39constexpr auto Tf_IsOstreamable_Impl(int) ->
40 decltype(std::declval<std::ostream &>() << std::declval<T>(), bool())
41{
42 return true;
43}
44
45template <class T>
46constexpr bool Tf_IsOstreamable_Impl(...) {
47 return false;
48}
49
50template <class T>
51constexpr bool Tf_IsOstreamable() {
52 return Tf_IsOstreamable_Impl<T>(0);
53}
54
57template <class T, uint32_t N>
58typename std::enable_if<PXR_NS::Tf_IsOstreamable<T>(), std::ostream &>::type
59operator<<(std::ostream &out, const TfSmallVector<T, N> &v)
60{
61 out << "[ ";
62 for (auto const &obj: v)
63 out << obj << " ";
64 out << "]";
65
66 return out;
67}
68
69PXR_NAMESPACE_CLOSE_SCOPE
70
71// These operator<< overloads need to go in the std namespace for
72// Koenig lookup to work.
73namespace std {
74
77template <class T>
78typename std::enable_if<PXR_NS::Tf_IsOstreamable<T>(), std::ostream &>::type
79operator<<(std::ostream &out, const std::vector<T> &v)
80{
81 out << "[ ";
82 for (auto const &obj: v)
83 out << obj << " ";
84 out << "]";
85
86 return out;
87}
88
91template <class T>
92typename std::enable_if<PXR_NS::Tf_IsOstreamable<T>(), std::ostream &>::type
93operator<<(std::ostream &out, const std::set<T> &v)
94{
95 out << "( ";
96 for (auto const &obj: v)
97 out << obj << " ";
98 out << ")";
99
100 return out;
101}
102
105template <class T>
106typename std::enable_if<PXR_NS::Tf_IsOstreamable<T>(), std::ostream &>::type
107operator<<(std::ostream &out, const std::list<T> &l)
108{
109 out << "{ ";
110 for (auto const &obj: l)
111 out << obj << " ";
112 out << "}";
113
114 return out;
115}
116
119template <class K, class M, class H, class C, class A>
120typename std::enable_if<
121 PXR_NS::Tf_IsOstreamable<K>() && PXR_NS::Tf_IsOstreamable<M>(), std::ostream &>::type
122operator<<(std::ostream &out, const PXR_NS::TfHashMap<K, M, H, C, A> &h)
123{
124 out << "< ";
125 for (auto const &p: h)
126 out << "<" << p.first << ": " << p.second << "> ";
127 out << ">";
128 return out;
129}
130
133template <class K, class M>
134typename std::enable_if<
135 PXR_NS::Tf_IsOstreamable<K>() && PXR_NS::Tf_IsOstreamable<M>(), std::ostream &>::type
136operator<<(std::ostream &out, const std::map<K, M> &h)
137{
138 out << "< ";
139 for (auto const &p: h)
140 out << "<" << p.first << ": " << p.second << "> ";
141 out << ">";
142 return out;
143}
144
145} // namespace std
146
147#endif // PXR_BASE_TF_OSTREAM_METHODS_H
This is a small-vector class with local storage optimization, the local storage can be specified via ...
Definition: smallVector.h:157
GF_API std::ostream & operator<<(std::ostream &, const GfBBox3d &)
Output a GfBBox3d using the format [(range) matrix zeroArea].
STL namespace.