src/common/tags.h
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Fri, 16 Feb 2007 09:56:21 +0100
changeset 286 57e6a2006962
parent 208 408c964b19e7
child 433 2c78631f0104
permissions -rw-r--r--
convert use of <cassert> to "ns3/assert.h"
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>
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
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    30
template <typename T>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    31
class TagPrettyPrinter;
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    32
94
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    33
/**
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    34
 * \ingroup constants
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    35
 * \brief Tag maximum size
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    36
 * 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
    37
 * in this constant.
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    38
 */
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    39
#define TAGS_MAX_SIZE 16
6aabc116c7c7 add Constants section to doxygen documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 93
diff changeset
    40
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    41
class Tags {
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    42
public:
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    43
  inline Tags ();
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    44
  inline Tags (Tags const &o);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    45
  inline Tags &operator = (Tags const &o);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    46
  inline ~Tags ();
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
  void Add (T const&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 Remove (T &tag);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    53
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    54
  template <typename T>
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    55
  bool Peek (T &tag) const;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    56
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    57
  void PrettyPrint (std::ostream &os);
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 {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    66
      struct TagData *m_next;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    67
      uint32_t m_id;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    68
      uint32_t m_count;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    69
      uint8_t m_data[Tags::SIZE];
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);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    73
  struct Tags::TagData *AllocData (void);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    74
  void FreeData (struct TagData *data);
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
  static struct Tags::TagData *gFree;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    77
  static uint32_t gN_free;
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
  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
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    82
/**
74
93b151b87563 fix documentation generation warning and add doc for TagPrettyPrinter
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 54
diff changeset
    83
 * \brief pretty print packet tags
93b151b87563 fix documentation generation warning and add doc for TagPrettyPrinter
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 54
diff changeset
    84
 * 
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    85
 * This class is used to register a pretty-printer
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    86
 * callback function to print in a nice user-friendly
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    87
 * way the content of the target type. To register
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    88
 * such a type, all you need to do is instantiate
93
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
    89
 * an instance of this type as a static variable.
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    90
 */
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    91
template <typename T>
93
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
    92
class TagRegistration {
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    93
public:
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    94
  /**
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    95
   * \param uuid a uuid generated with uuidgen
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    96
   * \param fn a function which can pretty-print an instance
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    97
   *        of type T in the output stream.
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
    98
   */
208
408c964b19e7 Make tags more robust with regard to lack of tag registration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
    99
  TagRegistration<T> (std::string uuid, void(*fn) (T const*, std::ostream &));
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   100
private:
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   101
  static void PrettyPrinterCb (uint8_t *buf, std::ostream &os);
208
408c964b19e7 Make tags more robust with regard to lack of tag registration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
   102
  static void(*m_prettyPrinter) (T const*, std::ostream &);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   103
};
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   104
85
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
   105
}; // namespace ns3
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
   106
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
   107
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
   108
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
   109
/**************************************************************
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   110
   An implementation of the templates defined above
85
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
   111
 *************************************************************/
286
57e6a2006962 convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 208
diff changeset
   112
#include "ns3/assert.h"
93
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   113
#include <string>
85
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
   114
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
   115
namespace ns3 {
7e09fbd38c99 doc typo
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 79
diff changeset
   116
93
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   117
class TagRegistry {
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   118
public:
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   119
  typedef void (*PrettyPrinter) (uint8_t [Tags::SIZE], std::ostream &);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   120
  static void Record (std::string uuid, PrettyPrinter prettyPrinter);
208
408c964b19e7 Make tags more robust with regard to lack of tag registration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
   121
  /**
408c964b19e7 Make tags more robust with regard to lack of tag registration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
   122
   * returns a numeric integer which uniquely identifies the input string.
408c964b19e7 Make tags more robust with regard to lack of tag registration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
   123
   * that integer cannot be zero which is a reserved value.
408c964b19e7 Make tags more robust with regard to lack of tag registration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
   124
   */
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   125
  static uint32_t LookupUid (std::string uuid);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   126
  static void PrettyPrint (uint32_t uid, uint8_t buf[Tags::SIZE], std::ostream &os);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   127
private:
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   128
  typedef std::vector<std::pair<std::string,PrettyPrinter> > TagsData;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   129
  typedef std::vector<std::pair<std::string,PrettyPrinter> >::const_iterator TagsDataCI;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   130
  static bool m_sorted;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   131
  static TagsData m_registry;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   132
};
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   133
/**
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   134
 * The TypeUid class is used to create a mapping Type --> uid
93
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   135
 * Note that we use a static getUuid function which contains a
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   136
 * static std::string variable rather than a simpler static
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   137
 * member std::string variable to ensure the proper order
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   138
 * of initialization when these methods are invoked
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   139
 * from the constructor of another static variable.
9
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
class TypeUid {
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   143
public:
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   144
  static void Record (std::string uuid);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   145
  static const uint32_t GetUid (void);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   146
private:
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   147
  static std::string *GetUuid (void);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   148
  T m_realType;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   149
};
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   150
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   151
template <typename T>
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   152
void TypeUid<T>::Record (std::string uuid)
93
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   153
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   154
  *(GetUuid ()) = uuid;
93
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   155
}
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   156
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   157
template <typename T>
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   158
const uint32_t TypeUid<T>::GetUid (void)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   159
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   160
  static const uint32_t uid = TagRegistry::LookupUid (*(GetUuid ()));
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   161
  return uid;
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
93
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   164
template <typename T>
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   165
std::string *TypeUid<T>::GetUuid (void)
93
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   166
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   167
  static std::string uuid;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   168
  return &uuid;
93
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   169
}
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   170
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
/**
93
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   174
 * Implementation of the TagRegistration registration class.
6318b8cbf212 implement new tag identification scheme
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   175
 * It records a callback with the TagRegistry
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   176
 * This callback performs type conversion before forwarding
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   177
 * the call to the user-provided function.
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   178
 */
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   179
template <typename T>
208
408c964b19e7 Make tags more robust with regard to lack of tag registration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
   180
TagRegistration<T>::TagRegistration (std::string uuid, void (*prettyPrinter) (T const*, std::ostream &))
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   181
{
286
57e6a2006962 convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 208
diff changeset
   182
  NS_ASSERT (sizeof (T) <= Tags::SIZE);
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   183
  m_prettyPrinter  = prettyPrinter;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   184
  TagRegistry::Record (uuid, &TagRegistration<T>::PrettyPrinterCb);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   185
  TypeUid<T>::Record (uuid);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   186
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   187
template <typename T>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   188
void 
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   189
TagRegistration<T>::PrettyPrinterCb (uint8_t *buf, std::ostream &os)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   190
{
286
57e6a2006962 convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 208
diff changeset
   191
  NS_ASSERT (sizeof (T) <= Tags::SIZE);
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   192
  T *tag = reinterpret_cast<T *> (buf);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   193
  (*m_prettyPrinter) (tag, os);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   194
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   195
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   196
template <typename T>
208
408c964b19e7 Make tags more robust with regard to lack of tag registration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
   197
void (*TagRegistration<T>::m_prettyPrinter) (T const*, std::ostream &) = 0;
9
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
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   200
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   201
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   202
template <typename T>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   203
void 
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   204
Tags::Add (T const&tag)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   205
{
286
57e6a2006962 convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 208
diff changeset
   206
  NS_ASSERT (sizeof (T) <= Tags::SIZE);
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   207
  uint8_t const*buf = reinterpret_cast<uint8_t const*> (&tag);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   208
  // ensure this id was not yet added
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   209
  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
   210
    {
286
57e6a2006962 convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 208
diff changeset
   211
      NS_ASSERT (cur->m_id != TypeUid<T>::GetUid ());
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   212
    }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   213
  struct TagData *newStart = AllocData ();
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   214
  newStart->m_count = 1;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   215
  newStart->m_next = 0;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   216
  newStart->m_id = TypeUid<T>::GetUid ();
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   217
  memcpy (newStart->m_data, buf, sizeof (T));
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   218
  newStart->m_next = m_next;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   219
  m_next = newStart;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   220
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   221
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   222
template <typename T>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   223
bool
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   224
Tags::Remove (T &tag)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   225
{
286
57e6a2006962 convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 208
diff changeset
   226
  NS_ASSERT (sizeof (T) <= Tags::SIZE);
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   227
  return Remove (TypeUid<T>::GetUid ());
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   228
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   229
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   230
template <typename T>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   231
bool
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   232
Tags::Peek (T &tag) const
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   233
{
286
57e6a2006962 convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 208
diff changeset
   234
  NS_ASSERT (sizeof (T) <= Tags::SIZE);
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   235
  uint8_t *buf = reinterpret_cast<uint8_t *> (&tag);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   236
  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
   237
    {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   238
      if (cur->m_id == TypeUid<T>::GetUid ()) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   239
        {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   240
          /* found tag */
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   241
          memcpy (buf, cur->m_data, sizeof (T));
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   242
          return true;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   243
        }
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
  /* no tag found */
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   246
  return false;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   247
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   248
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   249
Tags::Tags ()
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   250
  : m_next ()
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   251
{}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   252
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   253
Tags::Tags (Tags const &o)
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   254
  : m_next (o.m_next)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   255
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   256
  if (m_next != 0) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   257
    {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   258
      m_next->m_count++;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   259
    }
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   260
}
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
Tags &
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   263
Tags::operator = (Tags const &o)
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   264
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   265
  // self assignment
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   266
  if (m_next == o.m_next) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   267
    {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   268
      return *this;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   269
    }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   270
  RemoveAll ();
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   271
  m_next = o.m_next;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   272
  if (m_next != 0) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   273
    {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   274
      m_next->m_count++;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   275
    }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   276
  return *this;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   277
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   278
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   279
Tags::~Tags ()
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   280
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   281
  RemoveAll ();
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   282
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   283
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   284
void
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   285
Tags::RemoveAll (void)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   286
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   287
  struct TagData *prev = 0;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   288
  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
   289
    {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   290
      cur->m_count--;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   291
      if (cur->m_count > 0) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   292
        {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   293
          break;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   294
        }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   295
      if (prev != 0) 
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   296
        {
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   297
          FreeData (prev);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   298
        }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   299
      prev = cur;
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
  if (prev != 0) 
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
      FreeData (prev);
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   304
    }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 134
diff changeset
   305
  m_next = 0;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   306
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   307
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   308
16
99e833adbb46 change yans namespace to ns3
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 9
diff changeset
   309
}; // namespace ns3
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
#endif /* TAGS_H */