src/common/tags.h
author Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
Wed, 08 Aug 2007 15:10:36 +0100
changeset 1217 2f7791ae388d
parent 1155 1269189b9f41
child 1233 dade465d569d
permissions -rw-r--r--
WAF: add new bld.create_ns3_module() and bld.create_ns3_program() methods to make declaration of modules and programs simpler, and allowing us to change how ns-3 is built in a centralized way, without needing to change every module wscript file.
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
 * All rights reserved.
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
 * 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
     7
 * 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
     8
 * published by the Free Software Foundation;
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
 * 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
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
 * GNU General Public License for more details.
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
 * 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
    16
 * 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
    17
 * 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
    18
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    20
 */
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    21
#ifndef TAGS_H
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    22
#define TAGS_H
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    24
#include <stdint.h>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    25
#include <ostream>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    26
#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
    27
#include "buffer.h"
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    28
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    29
/**
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    30
 * \ingroup tag
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    31
 * \brief this macro should be instantiated exactly once for each
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    32
 *        new type of Tag
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    33
 *
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    34
 * This macro will ensure that your new Tag type is registered
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    35
 * within the tag registry. In most cases, this macro
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    36
 * is not really needed but, for safety, please, use it all the
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    37
 * time.
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    38
 *
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    39
 * Note: This macro is _absolutely_ needed if you try to run a
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    40
 * distributed simulation.
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    41
 */
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    42
#define NS_TAG_ENSURE_REGISTERED(x)            \
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    43
namespace {                                     \
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    44
static class thisisaveryverylongclassname       \
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    45
{                                               \
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    46
public:                                         \
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    47
  thisisaveryverylongclassname ()               \
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    48
  { uint32_t uid; uid = x::GetUid ();}          \
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    49
} g_thisisanotherveryveryverylongname;          \
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    50
}
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    51
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
    52
16
99e833adbb46 change yans namespace to ns3
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 9
diff changeset
    53
namespace ns3 {
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    54
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    55
template <typename T>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    56
class TagPrettyPrinter;
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    57
94
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    58
/**
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    59
 * \ingroup constants
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    60
 * \brief Tag maximum size
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    61
 * 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
    62
 * in this constant.
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    63
 */
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    64
#define TAGS_MAX_SIZE 16
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    65
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    66
class Tags {
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    67
public:
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    68
  inline Tags ();
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    69
  inline Tags (Tags const &o);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    70
  inline Tags &operator = (Tags const &o);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    71
  inline ~Tags ();
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    72
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    73
  template <typename T>
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    74
  void Add (T const&tag);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    75
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    76
  template <typename T>
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    77
  bool Remove (T &tag);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    78
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    79
  template <typename T>
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    80
  bool Peek (T &tag) const;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    81
1130
66078d851998 implement Tags::Serialize and Tags::Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1129
diff changeset
    82
  void Print (std::ostream &os) const;
66078d851998 implement Tags::Serialize and Tags::Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1129
diff changeset
    83
  uint32_t GetSerializedSize (void) const;
66078d851998 implement Tags::Serialize and Tags::Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1129
diff changeset
    84
  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
    85
  uint32_t Deserialize (Buffer::Iterator i);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    86
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    87
  inline void RemoveAll (void);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    88
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    89
  enum {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    90
      SIZE = TAGS_MAX_SIZE
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    91
  };
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    92
private:
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    93
  struct TagData {
433
2c78631f0104 implement constructor/destructor handling for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
    94
      uint8_t m_data[Tags::SIZE];
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    95
      struct TagData *m_next;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    96
      uint32_t m_id;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    97
      uint32_t m_count;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    98
  };
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    99
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   100
  bool Remove (uint32_t id);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   101
  struct Tags::TagData *AllocData (void);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   102
  void FreeData (struct TagData *data);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   103
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   104
  static struct Tags::TagData *gFree;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   105
  static uint32_t gN_free;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   106
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   107
  struct TagData *m_next;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   108
};
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   109
1128
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   110
} // namespace ns3
85
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
   111
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
   112
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
   113
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
   114
/**************************************************************
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   115
   An implementation of the templates defined above
85
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
   116
 *************************************************************/
286
57e6a2006962 convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 208
diff changeset
   117
#include "ns3/assert.h"
93
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   118
#include <string>
85
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
   119
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
   120
namespace ns3 {
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
   121
1129
30a69a9bb20c add internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1128
diff changeset
   122
/**
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   123
 * \brief a registry of all existing tag types.
1129
30a69a9bb20c add internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1128
diff changeset
   124
 * \internal
30a69a9bb20c add internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1128
diff changeset
   125
 *
30a69a9bb20c add internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1128
diff changeset
   126
 * This class is used to give polymorphic access to the methods
30a69a9bb20c add internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1128
diff changeset
   127
 * exported by a tag. It also is used to associate a single
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   128
 * reliable uid to each unique type. 
1129
30a69a9bb20c add internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1128
diff changeset
   129
 */
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   130
class TagRegistry
1128
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   131
{
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   132
public:
1128
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   133
  template <typename T>
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   134
  static uint32_t Register (std::string uidString);
1130
66078d851998 implement Tags::Serialize and Tags::Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1129
diff changeset
   135
  static std::string GetUidString (uint32_t uid);
66078d851998 implement Tags::Serialize and Tags::Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1129
diff changeset
   136
  static uint32_t GetUidFromUidString (std::string uidString);
1128
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   137
  static void Destruct (uint32_t uid, uint8_t data[Tags::SIZE]);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   138
  static void Print (uint32_t uid, uint8_t data[Tags::SIZE], std::ostream &os);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   139
  static uint32_t GetSerializedSize (uint32_t uid, uint8_t data[Tags::SIZE]);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   140
  static void Serialize (uint32_t uid, uint8_t data[Tags::SIZE], Buffer::Iterator start);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   141
  static uint32_t Deserialize (uint32_t uid, uint8_t data[Tags::SIZE], Buffer::Iterator start);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   142
private:
1128
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   143
  typedef void (*DestructCb) (uint8_t [Tags::SIZE]);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   144
  typedef void (*PrintCb) (uint8_t [Tags::SIZE], std::ostream &);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   145
  typedef uint32_t (*GetSerializedSizeCb) (uint8_t [Tags::SIZE]);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   146
  typedef void (*SerializeCb) (uint8_t [Tags::SIZE], Buffer::Iterator);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   147
  typedef uint32_t (*DeserializeCb) (uint8_t [Tags::SIZE], Buffer::Iterator);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   148
  struct TagInfo
433
2c78631f0104 implement constructor/destructor handling for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
   149
  {
1128
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   150
    std::string uidString;
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   151
    DestructCb destruct;
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   152
    PrintCb print;
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   153
    GetSerializedSizeCb getSerializedSize;
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   154
    SerializeCb serialize;
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   155
    DeserializeCb deserialize;
433
2c78631f0104 implement constructor/destructor handling for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
   156
  };
1128
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   157
  typedef std::vector<struct TagInfo> TagInfoVector;
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   158
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   159
  template <typename T>
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   160
  static void DoDestruct (uint8_t data[Tags::SIZE]);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   161
  template <typename T>
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   162
  static void DoPrint (uint8_t data[Tags::SIZE], std::ostream &os);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   163
  template <typename T>
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   164
  static uint32_t DoGetSerializedSize (uint8_t data[Tags::SIZE]);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   165
  template <typename T>
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   166
  static void DoSerialize (uint8_t data[Tags::SIZE], Buffer::Iterator start);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   167
  template <typename T>
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   168
  static uint32_t DoDeserialize (uint8_t data[Tags::SIZE], Buffer::Iterator start);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   169
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   170
  static TagInfoVector *GetInfo (void);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   171
};
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   172
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   173
template <typename T>
1128
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   174
void 
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   175
TagRegistry::DoDestruct (uint8_t data[Tags::SIZE])
1128
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   176
{
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   177
  T *tag = reinterpret_cast<T *> (data);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   178
  tag->~T ();  
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   179
}
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   180
template <typename T>
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   181
void 
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   182
TagRegistry::DoPrint (uint8_t data[Tags::SIZE], std::ostream &os)
1128
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   183
{
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   184
  T *tag = reinterpret_cast<T *> (data);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   185
  tag->Print (os);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   186
}
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   187
template <typename T>
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   188
uint32_t 
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   189
TagRegistry::DoGetSerializedSize (uint8_t data[Tags::SIZE])
93
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   190
{
1128
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   191
  T *tag = reinterpret_cast<T *> (data);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   192
  return tag->GetSerializedSize ();
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   193
}
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   194
template <typename T>
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   195
void 
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   196
TagRegistry::DoSerialize (uint8_t data[Tags::SIZE], Buffer::Iterator start)
1128
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   197
{
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   198
  T *tag = reinterpret_cast<T *> (data);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   199
  tag->Serialize (start);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   200
}
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   201
template <typename T>
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   202
uint32_t 
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   203
TagRegistry::DoDeserialize (uint8_t data[Tags::SIZE], Buffer::Iterator start)
1128
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   204
{
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   205
  T *tag = reinterpret_cast<T *> (data);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   206
  return tag->Deserialize (start);
93
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   207
}
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   208
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   209
template <typename T>
1128
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   210
uint32_t 
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   211
TagRegistry::Register (std::string uidString)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   212
{
1128
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   213
  TagInfoVector *vec = GetInfo ();
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   214
  uint32_t j = 0;
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   215
  for (TagInfoVector::iterator i = vec->begin (); i != vec->end (); i++)
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   216
    {
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   217
      if (i->uidString == uidString)
1128
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   218
        {
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   219
          return j;
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   220
        }
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   221
      j++;
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   222
    }
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   223
  TagInfo info;
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   224
  info.uidString = uidString;
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   225
  info.destruct = &TagRegistry::DoDestruct<T>;
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   226
  info.print = &TagRegistry::DoPrint<T>;
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   227
  info.getSerializedSize = &TagRegistry::DoGetSerializedSize<T>;
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   228
  info.serialize = &TagRegistry::DoSerialize<T>;
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   229
  info.deserialize = &TagRegistry::DoDeserialize<T>;
1128
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   230
  vec->push_back (info);
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   231
  uint32_t uid = vec->size ();
e5ab7564ae45 rework the Tags API to ensure proper uid generation for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 434
diff changeset
   232
  return uid;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   233
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   234
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   235
template <typename T>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   236
void 
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   237
Tags::Add (T const&tag)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   238
{
286
57e6a2006962 convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 208
diff changeset
   239
  NS_ASSERT (sizeof (T) <= Tags::SIZE);
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   240
  // ensure this id was not yet added
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   241
  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
   242
    {
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   243
      NS_ASSERT (cur->m_id != T::GetUid ());
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   244
    }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   245
  struct TagData *newStart = AllocData ();
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   246
  newStart->m_count = 1;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   247
  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
   248
  newStart->m_id = T::GetUid ();
433
2c78631f0104 implement constructor/destructor handling for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
   249
  void *buf = &newStart->m_data;
2c78631f0104 implement constructor/destructor handling for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
   250
  new (buf) T (tag);
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   251
  newStart->m_next = m_next;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   252
  m_next = newStart;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   253
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   254
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   255
template <typename T>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   256
bool
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   257
Tags::Remove (T &tag)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   258
{
286
57e6a2006962 convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 208
diff changeset
   259
  NS_ASSERT (sizeof (T) <= Tags::SIZE);
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   260
  return Remove (T::GetUid ());
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   261
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   262
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   263
template <typename T>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   264
bool
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   265
Tags::Peek (T &tag) const
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   266
{
286
57e6a2006962 convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 208
diff changeset
   267
  NS_ASSERT (sizeof (T) <= Tags::SIZE);
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   268
  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
   269
    {
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   270
      if (cur->m_id == T::GetUid ()) 
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   271
        {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   272
          /* found tag */
433
2c78631f0104 implement constructor/destructor handling for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
   273
          T *data = reinterpret_cast<T *> (&cur->m_data);
2c78631f0104 implement constructor/destructor handling for tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
   274
          tag = T (*data);
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   275
          return true;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   276
        }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   277
    }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   278
  /* no tag found */
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   279
  return false;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   280
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   281
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   282
Tags::Tags ()
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   283
  : m_next ()
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   284
{}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   285
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   286
Tags::Tags (Tags const &o)
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   287
  : m_next (o.m_next)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   288
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   289
  if (m_next != 0) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   290
    {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   291
      m_next->m_count++;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   292
    }
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   293
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   294
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   295
Tags &
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   296
Tags::operator = (Tags const &o)
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   297
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   298
  // self assignment
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   299
  if (m_next == o.m_next) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   300
    {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   301
      return *this;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   302
    }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   303
  RemoveAll ();
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   304
  m_next = o.m_next;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   305
  if (m_next != 0) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   306
    {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   307
      m_next->m_count++;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   308
    }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   309
  return *this;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   310
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   311
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   312
Tags::~Tags ()
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   313
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   314
  RemoveAll ();
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   315
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   316
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   317
void
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   318
Tags::RemoveAll (void)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   319
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   320
  struct TagData *prev = 0;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   321
  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
   322
    {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   323
      cur->m_count--;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   324
      if (cur->m_count > 0) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   325
        {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   326
          break;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   327
        }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   328
      if (prev != 0) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   329
        {
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   330
          TagRegistry::Destruct (prev->m_id, prev->m_data);
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   331
          FreeData (prev);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   332
        }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   333
      prev = cur;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   334
    }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   335
  if (prev != 0) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   336
    {
1155
1269189b9f41 update the Tag API to match the Header/Trailer API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1130
diff changeset
   337
      TagRegistry::Destruct (prev->m_id, prev->m_data);
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   338
      FreeData (prev);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   339
    }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   340
  m_next = 0;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   341
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   342
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   343
16
99e833adbb46 change yans namespace to ns3
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 9
diff changeset
   344
}; // namespace ns3
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   345
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   346
#endif /* TAGS_H */