src/common/tags.h
changeset 3248 39f736210ab2
parent 3247 05e66ff64e10
parent 3229 ec45f705b9ca
child 3249 a7203cfb5f37
--- a/src/common/tags.h	Fri May 30 15:31:50 2008 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,228 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2006 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-#ifndef TAGS_H
-#define TAGS_H
-
-#include <stdint.h>
-#include <ostream>
-#include <vector>
-#include "buffer.h"
-
-namespace ns3 {
-
-/**
- * \ingroup constants
- * \brief Tag maximum size
- * The maximum size (in bytes) of a Tag is stored
- * in this constant.
- */
-#define TAGS_MAX_SIZE 32
-
-class Tags {
-public:
-  inline Tags ();
-  inline Tags (Tags const &o);
-  inline Tags &operator = (Tags const &o);
-  inline ~Tags ();
-
-  template <typename T>
-  void Add (T const&tag) const;
-
-  template <typename T>
-  bool Remove (T &tag);
-
-  template <typename T>
-  bool Peek (T &tag) const;
-
-  void Print (std::ostream &os, std::string separator) const;
-  uint32_t GetSerializedSize (void) const;
-  void Serialize (Buffer::Iterator i, uint32_t size) const;
-  uint32_t Deserialize (Buffer::Iterator i);
-
-  inline void RemoveAll (void);
-
-  enum {
-      SIZE = TAGS_MAX_SIZE
-  };
-private:
-  struct TagData {
-      uint8_t m_data[Tags::SIZE];
-      struct TagData *m_next;
-      uint32_t m_id;
-      uint32_t m_count;
-  };
-
-  bool Remove (uint32_t id);
-  struct Tags::TagData *AllocData (void) const;
-  void FreeData (struct TagData *data) const;
-
-  static struct Tags::TagData *gFree;
-  static uint32_t gN_free;
-
-  struct TagData *m_next;
-};
-
-} // namespace ns3
-
-
-
-/**************************************************************
-   An implementation of the templates defined above
- *************************************************************/
-#include "tag-registry.h"
-#include "tag.h"
-#include "ns3/assert.h"
-#include <string>
-
-namespace ns3 {
-
-template <typename T>
-void 
-Tags::Add (T const&tag) const
-{
-  const Tag *parent;
-  // if the following assignment fails, it is because the
-  // input to this function is not a subclass of the Tag class.
-  parent = &tag;
-
-  NS_ASSERT (sizeof (T) <= Tags::SIZE);
-  // ensure this id was not yet added
-  for (struct TagData *cur = m_next; cur != 0; cur = cur->m_next) 
-    {
-      NS_ASSERT (cur->m_id != T::GetUid ());
-    }
-  struct TagData *newStart = AllocData ();
-  newStart->m_count = 1;
-  newStart->m_next = 0;
-  newStart->m_id = T::GetUid ();
-  void *buf = &newStart->m_data;
-  new (buf) T (tag);
-  newStart->m_next = m_next;
-  const_cast<Tags *> (this)->m_next = newStart;
-}
-
-template <typename T>
-bool
-Tags::Remove (T &tag)
-{
-  Tag *parent;
-  // if the following assignment fails, it is because the
-  // input to this function is not a subclass of the Tag class.
-  parent = &tag;
-  NS_ASSERT (sizeof (T) <= Tags::SIZE);
-  if (Peek (tag))
-    {
-      Remove (T::GetUid ());
-      return true;
-    }
-  else
-    {
-      return false;
-    }
-}
-
-template <typename T>
-bool
-Tags::Peek (T &tag) const
-{
-  Tag *parent;
-  // if the following assignment fails, it is because the
-  // input to this function is not a subclass of the Tag class.
-  parent = &tag;
-  NS_ASSERT (sizeof (T) <= Tags::SIZE);
-  for (struct TagData *cur = m_next; cur != 0; cur = cur->m_next) 
-    {
-      if (cur->m_id == T::GetUid ()) 
-        {
-          /* found tag */
-          T *data = reinterpret_cast<T *> (&cur->m_data);
-          tag = T (*data);
-          return true;
-        }
-    }
-  /* no tag found */
-  return false;
-}
-
-Tags::Tags ()
-  : m_next ()
-{}
-
-Tags::Tags (Tags const &o)
-  : m_next (o.m_next)
-{
-  if (m_next != 0) 
-    {
-      m_next->m_count++;
-    }
-}
-
-Tags &
-Tags::operator = (Tags const &o)
-{
-  // self assignment
-  if (m_next == o.m_next) 
-    {
-      return *this;
-    }
-  RemoveAll ();
-  m_next = o.m_next;
-  if (m_next != 0) 
-    {
-      m_next->m_count++;
-    }
-  return *this;
-}
-
-Tags::~Tags ()
-{
-  RemoveAll ();
-}
-
-void
-Tags::RemoveAll (void)
-{
-  struct TagData *prev = 0;
-  for (struct TagData *cur = m_next; cur != 0; cur = cur->m_next) 
-    {
-      cur->m_count--;
-      if (cur->m_count > 0) 
-        {
-          break;
-        }
-      if (prev != 0) 
-        {
-          TagRegistry::Destruct (prev->m_id, prev->m_data);
-          FreeData (prev);
-        }
-      prev = cur;
-    }
-  if (prev != 0) 
-    {
-      TagRegistry::Destruct (prev->m_id, prev->m_data);
-      FreeData (prev);
-    }
-  m_next = 0;
-}
-
-
-}; // namespace ns3
-
-#endif /* TAGS_H */