STIR 6.4.0
stream.inl
Go to the documentation of this file.
1//
2//
13/*
14 Copyright (C) 2000 PARAPET partners
15 Copyright (C) 2000-2009 Hammersmith Imanet Ltd
16 Copyright (C) 2013 Kris Thielemans
17 This file is part of STIR.
18
19 SPDX-License-Identifier: Apache-2.0 AND License-ref-PARAPET-license
20
21 See STIR/LICENSE.txt for details
22*/
23/* History:
24 KT 08/12/2000 corrected cases in operator<< for 0 length
25 KT 29/08/2001 added operator>>
26 KT 07/10/2002 corrected case in operator>> for 0 length and added more checking on stream state
27*/
28
29#include <algorithm>
30#include "stir/warning.h"
31
32START_NAMESPACE_STIR
33
34template <typename elemT>
35std::ostream&
36operator<<(std::ostream& str, const VectorWithOffset<elemT>& v)
37{
38 str << '{';
39 for (int i = v.get_min_index(); i < v.get_max_index(); i++)
40 str << v[i] << ", ";
41
42 if (v.get_length() > 0)
43 str << v[v.get_max_index()];
44 str << '}' << std::endl;
45 return str;
46}
47
48template <int num_dimensions, typename coordT>
49std::ostream&
50operator<<(std::ostream& str, const BasicCoordinate<num_dimensions, coordT>& v)
51{
52 str << '{';
53 for (int i = 1; i < num_dimensions; i++)
54 str << v[i] << ", ";
55
56 if (num_dimensions > 0)
57 str << v[num_dimensions];
58 str << '}';
59 return str;
60}
61
62template <typename elemT>
63std::ostream&
64operator<<(std::ostream& str, const std::vector<elemT>& v)
65{
66 str << '{';
67 // slightly different from above because vector::size() is unsigned
68 // so 0-1 == 0xFFFFFFFF (and not -1)
69 if (v.size() > 0)
70 {
71 for (unsigned int i = 0; i < v.size() - 1; i++)
72 str << v[i] << ", ";
73 str << v[v.size() - 1];
74 }
75 str << '}' << std::endl;
76 return str;
77}
78
79template <typename elemT>
80std::istream&
81operator>>(std::istream& str, std::vector<elemT>& v)
82{
83 v.resize(0);
84 char c;
85 str >> std::ws >> c;
86 if (!str || c != '{')
87 return str;
88
89 elemT t;
90 do
91 {
92 str >> t;
93 if (!str.fail())
94 {
95 v.push_back(t);
96 str >> std::ws >> c;
97 }
98 else
99 break;
100 } while (str && c == ',');
101
102 if (str.fail())
103 {
104 str.clear();
105 str >> std::ws >> c;
106 }
107 if (!str)
108 {
109 warning("\nreading a vector, expected closing }, but found EOF or worse. Length of vector returned is %ud\n", v.size());
110 return str;
111 }
112
113 if (c != '}')
114 warning("\nreading a vector, expected closing }, found %c instead. Length of vector returned is %u\n", c, v.size());
115 return str;
116}
117
118template <typename elemT>
119std::istream&
120operator>>(std::istream& str, VectorWithOffset<elemT>& v)
121{
122 std::vector<elemT> vv;
123 str >> vv;
124 v = VectorWithOffset<elemT>(static_cast<int>(vv.size()));
125 std::copy(vv.begin(), vv.end(), v.begin());
126 return str;
127}
128
129template <int num_dimensions, typename coordT>
130std::istream&
131operator>>(std::istream& str, BasicCoordinate<num_dimensions, coordT>& v)
132{
133 char c = '\0';
134 str >> std::ws >> c;
135 if (!str || c != '{')
136 {
137 warning("reading a coordinate of dimension %d, expected opening {, found %c instead.\n"
138 "Elements will be undefined",
139 num_dimensions,
140 c);
141 return str;
142 }
143 for (int i = 1; i <= num_dimensions; i++)
144 {
145 c = '\0';
146 str >> v[i];
147 str >> std::ws >> c;
148 if (i < num_dimensions && (!str || c != ','))
149 {
150 warning("reading a coordinate of dimension %d, expected comma, found %c instead.\n"
151 "Remaining elements will be undefined",
152 num_dimensions,
153 c);
154 return str;
155 }
156 if (i == num_dimensions && (!str || c != '}'))
157 {
158 warning("reading a coordinate of dimension %d, expected closing }, found %c instead.", num_dimensions, c);
159 return str;
160 }
161 }
162 return str;
163}
164
165END_NAMESPACE_STIR
class BasicCoordinate<int num_dimensions, typename coordT> defines num_dimensions -dimensional coordi...
Definition BasicCoordinate.h:57
A templated class for vectors, but with indices starting not from 0.
Definition VectorWithOffset.h:65
iterator begin()
use to initialise an iterator to the first element of the vector
Definition VectorWithOffset.inl:190
int get_max_index() const
get value of last valid index
Definition VectorWithOffset.inl:131
int get_min_index() const
get value of first valid index
Definition VectorWithOffset.inl:124
int get_length() const
return number of elements in this vector
Definition VectorWithOffset.inl:538
void warning(const char *const s,...)
Print warning with format string a la printf.
Definition warning.cxx:41
Declaration of stir::warning()