src/common/tags.h
author Tom Henderson <tomh@tomh.org>
Fri, 25 Apr 2008 14:29:28 -0700
changeset 3098 d384d52f8f6e
parent 2908 4ebd61a5612c
permissions -rw-r--r--
Cut over UDP applications to use the new receive API
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     2
/*
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
 * Copyright (c) 2006 INRIA
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     4
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    12
 * GNU General Public License for more details.
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    17
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    18
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
 */
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    20
#ifndef TAGS_H
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    21
#define TAGS_H
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    22
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
#include <stdint.h>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    24
#include <ostream>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    25
#include <vector>
1128
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
    26
#include "buffer.h"
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    27
16
99e833adbb46 change yans namespace to ns3
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 9
diff changeset
    28
namespace ns3 {
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    29
94
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    30
/**
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    31
 * \ingroup constants
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    32
 * \brief Tag maximum size
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    33
 * The maximum size (in bytes) of a Tag is stored
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    34
 * in this constant.
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    35
 */
3098
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 2908
diff changeset
    36
#define TAGS_MAX_SIZE 32
94
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    37
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    38
class Tags {
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    39
public:
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    40
  inline Tags ();
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    41
  inline Tags (Tags const &o);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    42
  inline Tags &operator = (Tags const &o);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    43
  inline ~Tags ();
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    44
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    45
  template <typename T>
2183
ad0b316969f5 make Packet::AddTag a const method
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1261
diff changeset
    46
  void Add (T const&tag) const;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    47
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    48
  template <typename T>
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    49
  bool Remove (T &tag);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    50
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    51
  template <typename T>
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    52
  bool Peek (T &tag) const;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    53
1261
f4bc87975995 avoid more spurious whitespaces during testing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1238
diff changeset
    54
  void Print (std::ostream &os, std::string separator) const;
1130
66078d851998 implement Tags::Serialize and Tags::Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1129
diff changeset
    55
  uint32_t GetSerializedSize (void) const;
66078d851998 implement Tags::Serialize and Tags::Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1129
diff changeset
    56
  void Serialize (Buffer::Iterator i, uint32_t size) const;
66078d851998 implement Tags::Serialize and Tags::Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1129
diff changeset
    57
  uint32_t Deserialize (Buffer::Iterator i);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    58
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    59
  inline void RemoveAll (void);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    60
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    61
  enum {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    62
      SIZE = TAGS_MAX_SIZE
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    63
  };
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    64
private:
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    65
  struct TagData {
2908
4ebd61a5612c Backed out changeset 9fa2f44cdafa
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2905
diff changeset
    66
      uint8_t m_data[Tags::SIZE];
4ebd61a5612c Backed out changeset 9fa2f44cdafa
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2905
diff changeset
    67
      struct TagData *m_next;
4ebd61a5612c Backed out changeset 9fa2f44cdafa
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2905
diff changeset
    68
      uint32_t m_id;
4ebd61a5612c Backed out changeset 9fa2f44cdafa
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2905
diff changeset
    69
      uint32_t m_count;
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    70
  };
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    71
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    72
  bool Remove (uint32_t id);
2908
4ebd61a5612c Backed out changeset 9fa2f44cdafa
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2905
diff changeset
    73
  struct Tags::TagData *AllocData (void) const;
2183
ad0b316969f5 make Packet::AddTag a const method
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1261
diff changeset
    74
  void FreeData (struct TagData *data) const;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    75
2908
4ebd61a5612c Backed out changeset 9fa2f44cdafa
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2905
diff changeset
    76
  static struct Tags::TagData *gFree;
4ebd61a5612c Backed out changeset 9fa2f44cdafa
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2905
diff changeset
    77
  static uint32_t gN_free;
4ebd61a5612c Backed out changeset 9fa2f44cdafa
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2905
diff changeset
    78
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    79
  struct TagData *m_next;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    80
};
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    81
1128
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
    82
} // namespace ns3
85
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
    83
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
    84
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
    85
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
    86
/**************************************************************
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    87
   An implementation of the templates defined above
85
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
    88
 *************************************************************/
1233
dade465d569d introduce Tag base class similar to Header and Trailer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1155
diff changeset
    89
#include "tag-registry.h"
dade465d569d introduce Tag base class similar to Header and Trailer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1155
diff changeset
    90
#include "tag.h"
286
57e6a2006962 convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 208
diff changeset
    91
#include "ns3/assert.h"
93
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
    92
#include <string>
85
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
    93
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
    94
namespace ns3 {
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
    95
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    96
template <typename T>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    97
void 
2183
ad0b316969f5 make Packet::AddTag a const method
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1261
diff changeset
    98
Tags::Add (T const&tag) const
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    99
{
1233
dade465d569d introduce Tag base class similar to Header and Trailer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1155
diff changeset
   100
  const Tag *parent;
dade465d569d introduce Tag base class similar to Header and Trailer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1155
diff changeset
   101
  // if the following assignment fails, it is because the
dade465d569d introduce Tag base class similar to Header and Trailer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1155
diff changeset
   102
  // input to this function is not a subclass of the Tag class.
dade465d569d introduce Tag base class similar to Header and Trailer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1155
diff changeset
   103
  parent = &tag;
dade465d569d introduce Tag base class similar to Header and Trailer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1155
diff changeset
   104
286
57e6a2006962 convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 208
diff changeset
   105
  NS_ASSERT (sizeof (T) <= Tags::SIZE);
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   106
  // ensure this id was not yet added
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   107
  for (struct TagData *cur = m_next; cur != 0; cur = cur->m_next) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   108
    {
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   109
      NS_ASSERT (cur->m_id != T::GetUid ());
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   110
    }
2908
4ebd61a5612c Backed out changeset 9fa2f44cdafa
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2905
diff changeset
   111
  struct TagData *newStart = AllocData ();
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   112
  newStart->m_count = 1;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   113
  newStart->m_next = 0;
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   114
  newStart->m_id = T::GetUid ();
2908
4ebd61a5612c Backed out changeset 9fa2f44cdafa
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2905
diff changeset
   115
  void *buf = &newStart->m_data;
433
2c78631f0104 implement constructor/destructor handling for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
   116
  new (buf) T (tag);
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   117
  newStart->m_next = m_next;
2183
ad0b316969f5 make Packet::AddTag a const method
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1261
diff changeset
   118
  const_cast<Tags *> (this)->m_next = newStart;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   119
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   120
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   121
template <typename T>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   122
bool
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   123
Tags::Remove (T &tag)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   124
{
1233
dade465d569d introduce Tag base class similar to Header and Trailer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1155
diff changeset
   125
  Tag *parent;
dade465d569d introduce Tag base class similar to Header and Trailer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1155
diff changeset
   126
  // if the following assignment fails, it is because the
dade465d569d introduce Tag base class similar to Header and Trailer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1155
diff changeset
   127
  // input to this function is not a subclass of the Tag class.
dade465d569d introduce Tag base class similar to Header and Trailer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1155
diff changeset
   128
  parent = &tag;
286
57e6a2006962 convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 208
diff changeset
   129
  NS_ASSERT (sizeof (T) <= Tags::SIZE);
2331
9df551386a93 Make Packet::RemoveTag behave as documented (bug #139)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2183
diff changeset
   130
  if (Peek (tag))
9df551386a93 Make Packet::RemoveTag behave as documented (bug #139)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2183
diff changeset
   131
    {
9df551386a93 Make Packet::RemoveTag behave as documented (bug #139)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2183
diff changeset
   132
      Remove (T::GetUid ());
9df551386a93 Make Packet::RemoveTag behave as documented (bug #139)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2183
diff changeset
   133
      return true;
9df551386a93 Make Packet::RemoveTag behave as documented (bug #139)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2183
diff changeset
   134
    }
9df551386a93 Make Packet::RemoveTag behave as documented (bug #139)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2183
diff changeset
   135
  else
9df551386a93 Make Packet::RemoveTag behave as documented (bug #139)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2183
diff changeset
   136
    {
9df551386a93 Make Packet::RemoveTag behave as documented (bug #139)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2183
diff changeset
   137
      return false;
9df551386a93 Make Packet::RemoveTag behave as documented (bug #139)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2183
diff changeset
   138
    }
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   139
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   140
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   141
template <typename T>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   142
bool
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   143
Tags::Peek (T &tag) const
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   144
{
1233
dade465d569d introduce Tag base class similar to Header and Trailer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1155
diff changeset
   145
  Tag *parent;
dade465d569d introduce Tag base class similar to Header and Trailer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1155
diff changeset
   146
  // if the following assignment fails, it is because the
dade465d569d introduce Tag base class similar to Header and Trailer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1155
diff changeset
   147
  // input to this function is not a subclass of the Tag class.
dade465d569d introduce Tag base class similar to Header and Trailer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1155
diff changeset
   148
  parent = &tag;
286
57e6a2006962 convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 208
diff changeset
   149
  NS_ASSERT (sizeof (T) <= Tags::SIZE);
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   150
  for (struct TagData *cur = m_next; cur != 0; cur = cur->m_next) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   151
    {
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   152
      if (cur->m_id == T::GetUid ()) 
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   153
        {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   154
          /* found tag */
2908
4ebd61a5612c Backed out changeset 9fa2f44cdafa
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2905
diff changeset
   155
          T *data = reinterpret_cast<T *> (&cur->m_data);
433
2c78631f0104 implement constructor/destructor handling for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
   156
          tag = T (*data);
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   157
          return true;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   158
        }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   159
    }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   160
  /* no tag found */
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   161
  return false;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   162
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   163
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   164
Tags::Tags ()
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   165
  : m_next ()
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   166
{}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   167
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   168
Tags::Tags (Tags const &o)
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   169
  : m_next (o.m_next)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   170
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   171
  if (m_next != 0) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   172
    {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   173
      m_next->m_count++;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   174
    }
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   175
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   176
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   177
Tags &
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   178
Tags::operator = (Tags const &o)
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   179
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   180
  // self assignment
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   181
  if (m_next == o.m_next) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   182
    {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   183
      return *this;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   184
    }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   185
  RemoveAll ();
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   186
  m_next = o.m_next;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   187
  if (m_next != 0) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   188
    {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   189
      m_next->m_count++;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   190
    }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   191
  return *this;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   192
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   193
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   194
Tags::~Tags ()
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   195
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   196
  RemoveAll ();
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   197
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   198
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   199
void
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   200
Tags::RemoveAll (void)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   201
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   202
  struct TagData *prev = 0;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   203
  for (struct TagData *cur = m_next; cur != 0; cur = cur->m_next) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   204
    {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   205
      cur->m_count--;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   206
      if (cur->m_count > 0) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   207
        {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   208
          break;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   209
        }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   210
      if (prev != 0) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   211
        {
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   212
          TagRegistry::Destruct (prev->m_id, prev->m_data);
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   213
          FreeData (prev);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   214
        }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   215
      prev = cur;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   216
    }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   217
  if (prev != 0) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   218
    {
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   219
      TagRegistry::Destruct (prev->m_id, prev->m_data);
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   220
      FreeData (prev);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   221
    }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   222
  m_next = 0;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   223
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   224
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   225
16
99e833adbb46 change yans namespace to ns3
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 9
diff changeset
   226
}; // namespace ns3
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   227
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   228
#endif /* TAGS_H */