annotate trunk/external/oscpack/osc/OscReceivedElements.h @ 706:f8e90b5d85fd tip

Delete CARFAC code from this repository. It has been moved to https://github.com/google/carfac Please email me with your github username to get access. I've also created a new mailing list to discuss CARFAC development: https://groups.google.com/forum/#!forum/carfac-dev
author ronw@google.com
date Thu, 18 Jul 2013 20:56:51 +0000
parents 4b37b53105a3
children
rev   line source
tomwalters@570 1 /*
tomwalters@570 2 oscpack -- Open Sound Control packet manipulation library
tomwalters@570 3 http://www.audiomulch.com/~rossb/oscpack
tomwalters@570 4
tomwalters@570 5 Copyright (c) 2004-2005 Ross Bencina <rossb@audiomulch.com>
tomwalters@570 6
tomwalters@570 7 Permission is hereby granted, free of charge, to any person obtaining
tomwalters@570 8 a copy of this software and associated documentation files
tomwalters@570 9 (the "Software"), to deal in the Software without restriction,
tomwalters@570 10 including without limitation the rights to use, copy, modify, merge,
tomwalters@570 11 publish, distribute, sublicense, and/or sell copies of the Software,
tomwalters@570 12 and to permit persons to whom the Software is furnished to do so,
tomwalters@570 13 subject to the following conditions:
tomwalters@570 14
tomwalters@570 15 The above copyright notice and this permission notice shall be
tomwalters@570 16 included in all copies or substantial portions of the Software.
tomwalters@570 17
tomwalters@570 18 Any person wishing to distribute modifications to the Software is
tomwalters@570 19 requested to send the modifications to the original developer so that
tomwalters@570 20 they can be incorporated into the canonical version.
tomwalters@570 21
tomwalters@570 22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
tomwalters@570 23 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
tomwalters@570 24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
tomwalters@570 25 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
tomwalters@570 26 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
tomwalters@570 27 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
tomwalters@570 28 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
tomwalters@570 29 */
tomwalters@570 30 #ifndef INCLUDED_OSCRECEIVEDELEMENTS_H
tomwalters@570 31 #define INCLUDED_OSCRECEIVEDELEMENTS_H
tomwalters@570 32
tomwalters@570 33 #include "OscTypes.h"
tomwalters@570 34 #include "OscException.h"
tomwalters@570 35
tomwalters@570 36
tomwalters@570 37 namespace osc{
tomwalters@570 38
tomwalters@570 39
tomwalters@570 40 class MalformedMessageException : public Exception{
tomwalters@570 41 public:
tomwalters@570 42 MalformedMessageException( const char *w="malformed message" )
tomwalters@570 43 : Exception( w ) {}
tomwalters@570 44 };
tomwalters@570 45
tomwalters@570 46 class MalformedBundleException : public Exception{
tomwalters@570 47 public:
tomwalters@570 48 MalformedBundleException( const char *w="malformed bundle" )
tomwalters@570 49 : Exception( w ) {}
tomwalters@570 50 };
tomwalters@570 51
tomwalters@570 52 class WrongArgumentTypeException : public Exception{
tomwalters@570 53 public:
tomwalters@570 54 WrongArgumentTypeException( const char *w="wrong argument type" )
tomwalters@570 55 : Exception( w ) {}
tomwalters@570 56 };
tomwalters@570 57
tomwalters@570 58 class MissingArgumentException : public Exception{
tomwalters@570 59 public:
tomwalters@570 60 MissingArgumentException( const char *w="missing argument" )
tomwalters@570 61 : Exception( w ) {}
tomwalters@570 62 };
tomwalters@570 63
tomwalters@570 64 class ExcessArgumentException : public Exception{
tomwalters@570 65 public:
tomwalters@570 66 ExcessArgumentException( const char *w="too many arguments" )
tomwalters@570 67 : Exception( w ) {}
tomwalters@570 68 };
tomwalters@570 69
tomwalters@570 70
tomwalters@570 71 class ReceivedPacket{
tomwalters@570 72 public:
tomwalters@570 73 ReceivedPacket( const char *contents, int32 size )
tomwalters@570 74 : contents_( contents )
tomwalters@570 75 , size_( size ) {}
tomwalters@570 76
tomwalters@570 77 bool IsMessage() const { return !IsBundle(); }
tomwalters@570 78 bool IsBundle() const;
tomwalters@570 79
tomwalters@570 80 int32 Size() const { return size_; }
tomwalters@570 81 const char *Contents() const { return contents_; }
tomwalters@570 82
tomwalters@570 83 private:
tomwalters@570 84 const char *contents_;
tomwalters@570 85 int32 size_;
tomwalters@570 86 };
tomwalters@570 87
tomwalters@570 88
tomwalters@570 89 class ReceivedBundleElement{
tomwalters@570 90 public:
tomwalters@570 91 ReceivedBundleElement( const char *size )
tomwalters@570 92 : size_( size ) {}
tomwalters@570 93
tomwalters@570 94 friend class ReceivedBundleElementIterator;
tomwalters@570 95
tomwalters@570 96 bool IsMessage() const { return !IsBundle(); }
tomwalters@570 97 bool IsBundle() const;
tomwalters@570 98
tomwalters@570 99 int32 Size() const;
tomwalters@570 100 const char *Contents() const { return size_ + 4; }
tomwalters@570 101
tomwalters@570 102 private:
tomwalters@570 103 const char *size_;
tomwalters@570 104 };
tomwalters@570 105
tomwalters@570 106
tomwalters@570 107 class ReceivedBundleElementIterator{
tomwalters@570 108 public:
tomwalters@570 109 ReceivedBundleElementIterator( const char *sizePtr )
tomwalters@570 110 : value_( sizePtr ) {}
tomwalters@570 111
tomwalters@570 112 ReceivedBundleElementIterator operator++()
tomwalters@570 113 {
tomwalters@570 114 Advance();
tomwalters@570 115 return *this;
tomwalters@570 116 }
tomwalters@570 117
tomwalters@570 118 ReceivedBundleElementIterator operator++(int)
tomwalters@570 119 {
tomwalters@570 120 ReceivedBundleElementIterator old( *this );
tomwalters@570 121 Advance();
tomwalters@570 122 return old;
tomwalters@570 123 }
tomwalters@570 124
tomwalters@570 125 const ReceivedBundleElement& operator*() const { return value_; }
tomwalters@570 126
tomwalters@570 127 const ReceivedBundleElement* operator->() const { return &value_; }
tomwalters@570 128
tomwalters@570 129 friend bool operator==(const ReceivedBundleElementIterator& lhs,
tomwalters@570 130 const ReceivedBundleElementIterator& rhs );
tomwalters@570 131
tomwalters@570 132 private:
tomwalters@570 133 ReceivedBundleElement value_;
tomwalters@570 134
tomwalters@570 135 void Advance() { value_.size_ = value_.Contents() + value_.Size(); }
tomwalters@570 136
tomwalters@570 137 bool IsEqualTo( const ReceivedBundleElementIterator& rhs ) const
tomwalters@570 138 {
tomwalters@570 139 return value_.size_ == rhs.value_.size_;
tomwalters@570 140 }
tomwalters@570 141 };
tomwalters@570 142
tomwalters@570 143 inline bool operator==(const ReceivedBundleElementIterator& lhs,
tomwalters@570 144 const ReceivedBundleElementIterator& rhs )
tomwalters@570 145 {
tomwalters@570 146 return lhs.IsEqualTo( rhs );
tomwalters@570 147 }
tomwalters@570 148
tomwalters@570 149 inline bool operator!=(const ReceivedBundleElementIterator& lhs,
tomwalters@570 150 const ReceivedBundleElementIterator& rhs )
tomwalters@570 151 {
tomwalters@570 152 return !( lhs == rhs );
tomwalters@570 153 }
tomwalters@570 154
tomwalters@570 155
tomwalters@570 156 class ReceivedMessageArgument{
tomwalters@570 157 public:
tomwalters@570 158 ReceivedMessageArgument( const char *typeTag, const char *argument )
tomwalters@570 159 : typeTag_( typeTag )
tomwalters@570 160 , argument_( argument ) {}
tomwalters@570 161
tomwalters@570 162 friend class ReceivedMessageArgumentIterator;
tomwalters@570 163
tomwalters@570 164 const char TypeTag() const { return *typeTag_; }
tomwalters@570 165
tomwalters@570 166 // the unchecked methods below don't check whether the argument actually
tomwalters@570 167 // is of the specified type. they should only be used if you've already
tomwalters@570 168 // checked the type tag or the associated IsType() method.
tomwalters@570 169
tomwalters@570 170 bool IsBool() const
tomwalters@570 171 { return *typeTag_ == TRUE_TYPE_TAG || *typeTag_ == FALSE_TYPE_TAG; }
tomwalters@570 172 bool AsBool() const;
tomwalters@570 173 bool AsBoolUnchecked() const;
tomwalters@570 174
tomwalters@570 175 bool IsNil() const { return *typeTag_ == NIL_TYPE_TAG; }
tomwalters@570 176 bool IsInfinitum() const { return *typeTag_ == INFINITUM_TYPE_TAG; }
tomwalters@570 177
tomwalters@570 178 bool IsInt32() const { return *typeTag_ == INT32_TYPE_TAG; }
tomwalters@570 179 int32 AsInt32() const;
tomwalters@570 180 int32 AsInt32Unchecked() const;
tomwalters@570 181
tomwalters@570 182 bool IsFloat() const { return *typeTag_ == FLOAT_TYPE_TAG; }
tomwalters@570 183 float AsFloat() const;
tomwalters@570 184 float AsFloatUnchecked() const;
tomwalters@570 185
tomwalters@570 186 bool IsChar() const { return *typeTag_ == CHAR_TYPE_TAG; }
tomwalters@570 187 char AsChar() const;
tomwalters@570 188 char AsCharUnchecked() const;
tomwalters@570 189
tomwalters@570 190 bool IsRgbaColor() const { return *typeTag_ == RGBA_COLOR_TYPE_TAG; }
tomwalters@570 191 uint32 AsRgbaColor() const;
tomwalters@570 192 uint32 AsRgbaColorUnchecked() const;
tomwalters@570 193
tomwalters@570 194 bool IsMidiMessage() const { return *typeTag_ == MIDI_MESSAGE_TYPE_TAG; }
tomwalters@570 195 uint32 AsMidiMessage() const;
tomwalters@570 196 uint32 AsMidiMessageUnchecked() const;
tomwalters@570 197
tomwalters@570 198 bool IsInt64() const { return *typeTag_ == INT64_TYPE_TAG; }
tomwalters@570 199 int64 AsInt64() const;
tomwalters@570 200 int64 AsInt64Unchecked() const;
tomwalters@570 201
tomwalters@570 202 bool IsTimeTag() const { return *typeTag_ == TIME_TAG_TYPE_TAG; }
tomwalters@570 203 uint64 AsTimeTag() const;
tomwalters@570 204 uint64 AsTimeTagUnchecked() const;
tomwalters@570 205
tomwalters@570 206 bool IsDouble() const { return *typeTag_ == DOUBLE_TYPE_TAG; }
tomwalters@570 207 double AsDouble() const;
tomwalters@570 208 double AsDoubleUnchecked() const;
tomwalters@570 209
tomwalters@570 210 bool IsString() const { return *typeTag_ == STRING_TYPE_TAG; }
tomwalters@570 211 const char* AsString() const;
tomwalters@570 212 const char* AsStringUnchecked() const { return argument_; }
tomwalters@570 213
tomwalters@570 214 bool IsSymbol() const { return *typeTag_ == SYMBOL_TYPE_TAG; }
tomwalters@570 215 const char* AsSymbol() const;
tomwalters@570 216 const char* AsSymbolUnchecked() const { return argument_; }
tomwalters@570 217
tomwalters@570 218 bool IsBlob() const { return *typeTag_ == BLOB_TYPE_TAG; }
tomwalters@570 219 void AsBlob( const void*& data, unsigned long& size ) const;
tomwalters@570 220 void AsBlobUnchecked( const void*& data, unsigned long& size ) const;
tomwalters@570 221
tomwalters@570 222 private:
tomwalters@570 223 const char *typeTag_;
tomwalters@570 224 const char *argument_;
tomwalters@570 225 };
tomwalters@570 226
tomwalters@570 227
tomwalters@570 228 class ReceivedMessageArgumentIterator{
tomwalters@570 229 public:
tomwalters@570 230 ReceivedMessageArgumentIterator( const char *typeTags, const char *arguments )
tomwalters@570 231 : value_( typeTags, arguments ) {}
tomwalters@570 232
tomwalters@570 233 ReceivedMessageArgumentIterator operator++()
tomwalters@570 234 {
tomwalters@570 235 Advance();
tomwalters@570 236 return *this;
tomwalters@570 237 }
tomwalters@570 238
tomwalters@570 239 ReceivedMessageArgumentIterator operator++(int)
tomwalters@570 240 {
tomwalters@570 241 ReceivedMessageArgumentIterator old( *this );
tomwalters@570 242 Advance();
tomwalters@570 243 return old;
tomwalters@570 244 }
tomwalters@570 245
tomwalters@570 246 const ReceivedMessageArgument& operator*() const { return value_; }
tomwalters@570 247
tomwalters@570 248 const ReceivedMessageArgument* operator->() const { return &value_; }
tomwalters@570 249
tomwalters@570 250 friend bool operator==(const ReceivedMessageArgumentIterator& lhs,
tomwalters@570 251 const ReceivedMessageArgumentIterator& rhs );
tomwalters@570 252
tomwalters@570 253 private:
tomwalters@570 254 ReceivedMessageArgument value_;
tomwalters@570 255
tomwalters@570 256 void Advance();
tomwalters@570 257
tomwalters@570 258 bool IsEqualTo( const ReceivedMessageArgumentIterator& rhs ) const
tomwalters@570 259 {
tomwalters@570 260 return value_.typeTag_ == rhs.value_.typeTag_;
tomwalters@570 261 }
tomwalters@570 262 };
tomwalters@570 263
tomwalters@570 264 inline bool operator==(const ReceivedMessageArgumentIterator& lhs,
tomwalters@570 265 const ReceivedMessageArgumentIterator& rhs )
tomwalters@570 266 {
tomwalters@570 267 return lhs.IsEqualTo( rhs );
tomwalters@570 268 }
tomwalters@570 269
tomwalters@570 270 inline bool operator!=(const ReceivedMessageArgumentIterator& lhs,
tomwalters@570 271 const ReceivedMessageArgumentIterator& rhs )
tomwalters@570 272 {
tomwalters@570 273 return !( lhs == rhs );
tomwalters@570 274 }
tomwalters@570 275
tomwalters@570 276
tomwalters@570 277 class ReceivedMessageArgumentStream{
tomwalters@570 278 friend class ReceivedMessage;
tomwalters@570 279 ReceivedMessageArgumentStream( const ReceivedMessageArgumentIterator& begin,
tomwalters@570 280 const ReceivedMessageArgumentIterator& end )
tomwalters@570 281 : p_( begin )
tomwalters@570 282 , end_( end ) {}
tomwalters@570 283
tomwalters@570 284 ReceivedMessageArgumentIterator p_, end_;
tomwalters@570 285
tomwalters@570 286 public:
tomwalters@570 287
tomwalters@570 288 // end of stream
tomwalters@570 289 bool Eos() const { return p_ == end_; }
tomwalters@570 290
tomwalters@570 291 ReceivedMessageArgumentStream& operator>>( bool& rhs )
tomwalters@570 292 {
tomwalters@570 293 if( Eos() )
tomwalters@570 294 throw MissingArgumentException();
tomwalters@570 295
tomwalters@570 296 rhs = (*p_++).AsBool();
tomwalters@570 297 return *this;
tomwalters@570 298 }
tomwalters@570 299
tomwalters@570 300 // not sure if it would be useful to stream Nil and Infinitum
tomwalters@570 301 // for now it's not possible
tomwalters@570 302
tomwalters@570 303 ReceivedMessageArgumentStream& operator>>( int32& rhs )
tomwalters@570 304 {
tomwalters@570 305 if( Eos() )
tomwalters@570 306 throw MissingArgumentException();
tomwalters@570 307
tomwalters@570 308 rhs = (*p_++).AsInt32();
tomwalters@570 309 return *this;
tomwalters@570 310 }
tomwalters@570 311
tomwalters@570 312 ReceivedMessageArgumentStream& operator>>( float& rhs )
tomwalters@570 313 {
tomwalters@570 314 if( Eos() )
tomwalters@570 315 throw MissingArgumentException();
tomwalters@570 316
tomwalters@570 317 rhs = (*p_++).AsFloat();
tomwalters@570 318 return *this;
tomwalters@570 319 }
tomwalters@570 320
tomwalters@570 321 ReceivedMessageArgumentStream& operator>>( char& rhs )
tomwalters@570 322 {
tomwalters@570 323 if( Eos() )
tomwalters@570 324 throw MissingArgumentException();
tomwalters@570 325
tomwalters@570 326 rhs = (*p_++).AsChar();
tomwalters@570 327 return *this;
tomwalters@570 328 }
tomwalters@570 329
tomwalters@570 330 ReceivedMessageArgumentStream& operator>>( RgbaColor& rhs )
tomwalters@570 331 {
tomwalters@570 332 if( Eos() )
tomwalters@570 333 throw MissingArgumentException();
tomwalters@570 334
tomwalters@570 335 rhs.value = (*p_++).AsRgbaColor();
tomwalters@570 336 return *this;
tomwalters@570 337 }
tomwalters@570 338
tomwalters@570 339 ReceivedMessageArgumentStream& operator>>( MidiMessage& rhs )
tomwalters@570 340 {
tomwalters@570 341 if( Eos() )
tomwalters@570 342 throw MissingArgumentException();
tomwalters@570 343
tomwalters@570 344 rhs.value = (*p_++).AsMidiMessage();
tomwalters@570 345 return *this;
tomwalters@570 346 }
tomwalters@570 347
tomwalters@570 348 ReceivedMessageArgumentStream& operator>>( int64& rhs )
tomwalters@570 349 {
tomwalters@570 350 if( Eos() )
tomwalters@570 351 throw MissingArgumentException();
tomwalters@570 352
tomwalters@570 353 rhs = (*p_++).AsInt64();
tomwalters@570 354 return *this;
tomwalters@570 355 }
tomwalters@570 356
tomwalters@570 357 ReceivedMessageArgumentStream& operator>>( TimeTag& rhs )
tomwalters@570 358 {
tomwalters@570 359 if( Eos() )
tomwalters@570 360 throw MissingArgumentException();
tomwalters@570 361
tomwalters@570 362 rhs.value = (*p_++).AsTimeTag();
tomwalters@570 363 return *this;
tomwalters@570 364 }
tomwalters@570 365
tomwalters@570 366 ReceivedMessageArgumentStream& operator>>( double& rhs )
tomwalters@570 367 {
tomwalters@570 368 if( Eos() )
tomwalters@570 369 throw MissingArgumentException();
tomwalters@570 370
tomwalters@570 371 rhs = (*p_++).AsDouble();
tomwalters@570 372 return *this;
tomwalters@570 373 }
tomwalters@570 374
tomwalters@570 375 ReceivedMessageArgumentStream& operator>>( Blob& rhs )
tomwalters@570 376 {
tomwalters@570 377 if( Eos() )
tomwalters@570 378 throw MissingArgumentException();
tomwalters@570 379
tomwalters@570 380 (*p_++).AsBlob( rhs.data, rhs.size );
tomwalters@570 381 return *this;
tomwalters@570 382 }
tomwalters@570 383
tomwalters@570 384 ReceivedMessageArgumentStream& operator>>( const char*& rhs )
tomwalters@570 385 {
tomwalters@570 386 if( Eos() )
tomwalters@570 387 throw MissingArgumentException();
tomwalters@570 388
tomwalters@570 389 rhs = (*p_++).AsString();
tomwalters@570 390 return *this;
tomwalters@570 391 }
tomwalters@570 392
tomwalters@570 393 ReceivedMessageArgumentStream& operator>>( Symbol& rhs )
tomwalters@570 394 {
tomwalters@570 395 if( Eos() )
tomwalters@570 396 throw MissingArgumentException();
tomwalters@570 397
tomwalters@570 398 rhs.value = (*p_++).AsSymbol();
tomwalters@570 399 return *this;
tomwalters@570 400 }
tomwalters@570 401
tomwalters@570 402 ReceivedMessageArgumentStream& operator>>( MessageTerminator& rhs )
tomwalters@570 403 {
tomwalters@570 404 if( !Eos() )
tomwalters@570 405 throw ExcessArgumentException();
tomwalters@570 406
tomwalters@570 407 return *this;
tomwalters@570 408 }
tomwalters@570 409 };
tomwalters@570 410
tomwalters@570 411
tomwalters@570 412 class ReceivedMessage{
tomwalters@570 413 void Init( const char *bundle, unsigned long size );
tomwalters@570 414 public:
tomwalters@570 415 explicit ReceivedMessage( const ReceivedPacket& packet );
tomwalters@570 416 explicit ReceivedMessage( const ReceivedBundleElement& bundleElement );
tomwalters@570 417
tomwalters@570 418 const char *AddressPattern() const { return addressPattern_; }
tomwalters@570 419
tomwalters@570 420 // Support for non-standad SuperCollider integer address patterns:
tomwalters@570 421 bool AddressPatternIsUInt32() const;
tomwalters@570 422 uint32 AddressPatternAsUInt32() const;
tomwalters@570 423
tomwalters@570 424 unsigned long ArgumentCount() const { return static_cast<unsigned long>(typeTagsEnd_ - typeTagsBegin_); }
tomwalters@570 425
tomwalters@570 426 const char *TypeTags() const { return typeTagsBegin_; }
tomwalters@570 427
tomwalters@570 428
tomwalters@570 429 typedef ReceivedMessageArgumentIterator const_iterator;
tomwalters@570 430
tomwalters@570 431 ReceivedMessageArgumentIterator ArgumentsBegin() const
tomwalters@570 432 {
tomwalters@570 433 return ReceivedMessageArgumentIterator( typeTagsBegin_, arguments_ );
tomwalters@570 434 }
tomwalters@570 435
tomwalters@570 436 ReceivedMessageArgumentIterator ArgumentsEnd() const
tomwalters@570 437 {
tomwalters@570 438 return ReceivedMessageArgumentIterator( typeTagsEnd_, 0 );
tomwalters@570 439 }
tomwalters@570 440
tomwalters@570 441 ReceivedMessageArgumentStream ArgumentStream() const
tomwalters@570 442 {
tomwalters@570 443 return ReceivedMessageArgumentStream( ArgumentsBegin(), ArgumentsEnd() );
tomwalters@570 444 }
tomwalters@570 445
tomwalters@570 446 private:
tomwalters@570 447 const char *addressPattern_;
tomwalters@570 448 const char *typeTagsBegin_;
tomwalters@570 449 const char *typeTagsEnd_;
tomwalters@570 450 const char *arguments_;
tomwalters@570 451 };
tomwalters@570 452
tomwalters@570 453
tomwalters@570 454 class ReceivedBundle{
tomwalters@570 455 void Init( const char *message, unsigned long size );
tomwalters@570 456 public:
tomwalters@570 457 explicit ReceivedBundle( const ReceivedPacket& packet );
tomwalters@570 458 explicit ReceivedBundle( const ReceivedBundleElement& bundleElement );
tomwalters@570 459
tomwalters@570 460 uint64 TimeTag() const;
tomwalters@570 461
tomwalters@570 462 unsigned long ElementCount() const { return elementCount_; }
tomwalters@570 463
tomwalters@570 464 typedef ReceivedBundleElementIterator const_iterator;
tomwalters@570 465
tomwalters@570 466 ReceivedBundleElementIterator ElementsBegin() const
tomwalters@570 467 {
tomwalters@570 468 return ReceivedBundleElementIterator( timeTag_ + 8 );
tomwalters@570 469 }
tomwalters@570 470
tomwalters@570 471 ReceivedBundleElementIterator ElementsEnd() const
tomwalters@570 472 {
tomwalters@570 473 return ReceivedBundleElementIterator( end_ );
tomwalters@570 474 }
tomwalters@570 475
tomwalters@570 476 private:
tomwalters@570 477 const char *timeTag_;
tomwalters@570 478 const char *end_;
tomwalters@570 479 unsigned long elementCount_;
tomwalters@570 480 };
tomwalters@570 481
tomwalters@570 482
tomwalters@570 483 } // namespace osc
tomwalters@570 484
tomwalters@570 485
tomwalters@570 486 #endif /* INCLUDED_OSCRECEIVEDELEMENTS_H */