This document is for a version of USD that is under development. See this page for the current release.
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.