14 #ifndef GDCMBYTEVALUE_H
15 #define GDCMBYTEVALUE_H
37 Internal(array, array+vl),Length(vl) {
41 Internal.resize(vl+1);
47 ByteValue(std::vector<char> &v):Internal(v),Length((uint32_t)v.size()) {}
58 void PrintASCII(std::ostream &os,
VL maxlength )
const;
60 void PrintHex(std::ostream &os,
VL maxlength)
const;
64 assert( Length == 2 );
69 if( Internal.empty() ) assert( Length == 0 );
70 return Internal.empty();
76 #ifdef GDCM_SUPPORT_BROKEN_IMPLEMENTATION
81 "BUGGY HEADER: Your dicom contain odd length value field." );
93 #ifdef SHORT_READ_HACK
102 throw Exception(
"Impossible to allocate" );
108 operator const std::vector<char>& ()
const {
return Internal; }
111 Internal = val.Internal;
117 if( Length != val.Length )
119 if( Internal == val.Internal )
126 return Length == bv.Length && Internal == bv.Internal;
135 if(!Internal.empty())
return &Internal[0];
140 std::vector<char>::iterator it = Internal.begin();
141 for(; it != Internal.end(); ++it) *it = c;
143 bool GetBuffer(
char *buffer,
unsigned long length)
const;
147 assert( !(Internal.size() % 2) );
148 os.write(&Internal[0], Internal.size() );
153 template <
typename TSwap,
typename TType>
154 std::istream &
Read(std::istream &is) {
161 is.read(&Internal[0], Length);
162 assert( Internal.size() == Length || Internal.size() == Length + 1 );
163 TSwap::SwapArray((TType*)&Internal[0], Internal.size() /
sizeof(TType) );
168 template <
typename TSwap>
169 std::istream &
Read(std::istream &is) {
170 return Read<TSwap,uint8_t>(is);
174 template <
typename TSwap,
typename TType>
175 std::ostream
const &
Write(std::ostream &os)
const {
176 assert( !(Internal.size() % 2) );
177 if( !Internal.empty() ) {
179 std::vector<char> copy = Internal;
180 TSwap::SwapArray((TType*)©[0], Internal.size() /
sizeof(TType) );
181 os.write(©[0], copy.size());
186 template <
typename TSwap>
187 std::ostream
const &
Write(std::ostream &os)
const {
188 return Write<TSwap,uint8_t>(os);
198 assert( length <= Length );
199 for(
unsigned int i=0; i<length; i++)
201 if ( i == (length-1) && Internal[i] ==
'\0')
continue;
202 if ( !( isprint((
unsigned char)Internal[i]) || isspace((
unsigned char)Internal[i]) ) )
212 void Print(std::ostream &os)
const {
215 if( !Internal.empty() )
217 if( IsPrintable(Length) )
220 std::vector<char>::size_type length = Length;
221 if( Internal.back() == 0 ) --length;
222 std::copy(Internal.begin(), Internal.begin()+length,
223 std::ostream_iterator<char>(os));
226 os <<
"Loaded:" << Internal.size();
231 os <<
"(no value available)";
237 std::vector<char> Internal;
247 #endif //GDCMBYTEVALUE_H