OpenVPN 3 Core Library
Loading...
Searching...
No Matches
ostream_containers.hpp
Go to the documentation of this file.
1// OpenVPN -- An application to securely tunnel IP networks
2// over a single port, with support for SSL/TLS-based
3// session authentication and key exchange,
4// packet encryption, packet authentication, and
5// packet compression.
6//
7// Copyright (C) 2022- OpenVPN Inc.
8//
9// SPDX-License-Identifier: MPL-2.0 OR AGPL-3.0-only WITH openvpn3-openssl-exception
10//
11
12
20#pragma once
21
22#include <ostream>
23
24namespace openvpn::C2os {
25
35template <typename C>
37{
38 explicit Container(const C &container)
39 : ref(container)
40 {
41 }
42 const C &ref;
43};
44
54template <typename C>
55inline const auto cast(const C &container)
56{
57 return Container<C>(container);
58}
59
68template <typename C>
69inline std::ostream &operator<<(std::ostream &os, const Container<C> &container)
70{
71 constexpr char separator[] = ", ";
72 const char *delimiter = "";
73 os << "[";
74 for (const auto &e : container.ref)
75 {
76 os << delimiter << e;
77 delimiter = separator;
78 }
79 os << "]";
80 return os;
81}
82
88template <typename C>
90{
91 using Container<C>::Container;
92};
93
104template <typename C>
105inline const auto cast_deref(const C &container)
106{
107 return PtrContainer<C>(container);
108}
109
118template <typename C>
119inline std::ostream &operator<<(std::ostream &os, const PtrContainer<C> &container)
120{
121 constexpr char separator[] = ", ";
122 const char *delimiter = "";
123 os << "[";
124 for (const auto &e : container.ref)
125 {
126 os << delimiter << *e;
127 delimiter = separator;
128 }
129 os << "]";
130 return os;
131}
132
133} // namespace openvpn::C2os
const auto cast(const C &container)
Provide an instance of C2os::Container<C> from the underlying container.
const auto cast_deref(const C &container)
Provide an instance of C2os::PtrContainer<C> from the underlying container.
std::ostream & operator<<(std::ostream &os, const Container< C > &container)
overload ostream operator<< for the C2os::Container<C> type
New typename for holding the underlying container type.
Container(const C &container)
same idea as C2os::Container<C>, above; importantly, with a different typename
std::ostringstream os