annotate external/oscpack/osc/OscReceivedElements.h @ 648:1c2a5868f23a

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