src/core/attribute-list.cc
author Ma Keith <keith.nwsuaf@gmail.com>
Fri, 26 Jun 2009 08:56:13 +0200
changeset 4600 d62a149c4b70
parent 4252 c82988c68a35
permissions -rw-r--r--
bug 607: AttributeList::Deserialize buggy
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2671
7fa114622a4d add missing license headers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2633
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
7fa114622a4d add missing license headers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2633
diff changeset
     2
/*
7fa114622a4d add missing license headers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2633
diff changeset
     3
 * Copyright (c) 2008 INRIA
7fa114622a4d add missing license headers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2633
diff changeset
     4
 *
7fa114622a4d add missing license headers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2633
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
7fa114622a4d add missing license headers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2633
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
7fa114622a4d add missing license headers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2633
diff changeset
     7
 * published by the Free Software Foundation;
7fa114622a4d add missing license headers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2633
diff changeset
     8
 *
7fa114622a4d add missing license headers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2633
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
7fa114622a4d add missing license headers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2633
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7fa114622a4d add missing license headers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2633
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
7fa114622a4d add missing license headers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2633
diff changeset
    12
 * GNU General Public License for more details.
7fa114622a4d add missing license headers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2633
diff changeset
    13
 *
7fa114622a4d add missing license headers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2633
diff changeset
    14
 * You should have received a copy of the GNU General Public License
7fa114622a4d add missing license headers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2633
diff changeset
    15
 * along with this program; if not, write to the Free Software
7fa114622a4d add missing license headers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2633
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
7fa114622a4d add missing license headers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2633
diff changeset
    17
 *
7fa114622a4d add missing license headers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2633
diff changeset
    18
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
7fa114622a4d add missing license headers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2633
diff changeset
    19
 */
2633
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    20
#include "attribute-list.h"
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    21
#include "string.h"
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    22
#include "singleton.h"
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    24
namespace ns3 {
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    25
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    26
/*********************************************************************
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    27
 *         The AttributeList container implementation
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    28
 *********************************************************************/
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    29
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    30
AttributeList::AttributeList ()
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    31
{}
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    32
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    33
AttributeList::AttributeList (const AttributeList &o)
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    34
{
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    35
  for (Attrs::const_iterator i = o.m_attributes.begin (); i != o.m_attributes.end (); i++)
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    36
    {
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    37
      struct Attr attr;
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    38
      attr.checker = i->checker;
2965
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
    39
      attr.value = i->value->Copy ();
2633
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    40
      m_attributes.push_back (attr);
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    41
    }
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    42
}
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    43
AttributeList &
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    44
AttributeList::operator = (const AttributeList &o)
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    45
{
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    46
  Reset ();
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    47
  for (Attrs::const_iterator i = o.m_attributes.begin (); i != o.m_attributes.end (); i++)
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    48
    {
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    49
      struct Attr attr;
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    50
      attr.checker = i->checker;
2965
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
    51
      attr.value = i->value->Copy ();
2633
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    52
      m_attributes.push_back (attr);
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    53
    }
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    54
  return *this;
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    55
}
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    56
AttributeList::~AttributeList ()
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    57
{
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    58
  Reset ();
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    59
}
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    60
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    61
void
2965
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
    62
AttributeList::Set (std::string name, const AttributeValue &value)
2633
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    63
{
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    64
  struct TypeId::AttributeInfo info;
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    65
  bool ok = TypeId::LookupAttributeByFullName (name, &info);
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    66
  if (!ok)
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    67
    {
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    68
      NS_FATAL_ERROR ("Could not find attribute "<<name);
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    69
    }
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    70
  ok = DoSet (&info, value);
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    71
  if (!ok)
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    72
    {
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    73
      NS_FATAL_ERROR ("Could not set value for attribute "<<name);
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    74
    }
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    75
}
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    76
bool 
2965
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
    77
AttributeList::SetFailSafe (std::string name, const AttributeValue &value)
2633
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    78
{
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    79
  struct TypeId::AttributeInfo info;
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    80
  bool ok = TypeId::LookupAttributeByFullName (name, &info);
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    81
  if (!ok)
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    82
    {
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    83
      return false;
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    84
    }
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    85
  ok = DoSet (&info, value);
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    86
  return ok;
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    87
}
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    88
void
2965
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
    89
AttributeList::SetWithTid (TypeId tid, std::string name, const AttributeValue & value)
2633
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    90
{
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    91
  struct TypeId::AttributeInfo info;
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    92
  bool ok = tid.LookupAttributeByName (name, &info);
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    93
  if (!ok)
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    94
    {
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    95
      NS_FATAL_ERROR ("Could not find attribute "<<tid.GetName ()<<"::"<<name);
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    96
    }
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    97
  ok = DoSet (&info, value);
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    98
  if (!ok)
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    99
    {
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   100
      NS_FATAL_ERROR ("Could not set value for attribute "<<tid.GetName ()<<"::"<<name);
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   101
    }
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   102
}
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   103
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   104
void
2965
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   105
AttributeList::DoSetOne (Ptr<const AttributeChecker> checker, const AttributeValue &value)
2633
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   106
{
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   107
  // get rid of any previous value stored in this
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   108
  // vector of values.
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   109
  for (Attrs::iterator k = m_attributes.begin (); k != m_attributes.end (); k++)
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   110
    {
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   111
      if (k->checker == checker)
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   112
        {
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   113
          m_attributes.erase (k);
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   114
          break;
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   115
        }
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   116
    }
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   117
  // store the new value.
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   118
  struct Attr attr;
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   119
  attr.checker = checker;
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   120
  attr.value = value.Copy ();
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   121
  m_attributes.push_back (attr);
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   122
}
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   123
bool
2965
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   124
AttributeList::DoSet (struct TypeId::AttributeInfo *info, const AttributeValue &value)
2633
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   125
{
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   126
  if (info->checker == 0)
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   127
    {
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   128
      return false;
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   129
    }
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   130
  bool ok = info->checker->Check (value);
2965
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   131
  if (ok)
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   132
    {
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   133
      DoSetOne (info->checker, value);
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   134
      return true;
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   135
    }
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   136
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   137
  // attempt to convert to string.
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   138
  const StringValue *str = dynamic_cast<const StringValue *> (&value);
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   139
  if (str == 0)
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   140
    {
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   141
      return false;
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   142
    }
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   143
  // attempt to convert back to value.
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   144
  Ptr<AttributeValue> v = info->checker->Create ();
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   145
  ok = v->DeserializeFromString (str->Get (), info->checker);
2633
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   146
  if (!ok)
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   147
    {
2965
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   148
      return false;
2633
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   149
    }
2965
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   150
  ok = info->checker->Check (*v);
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   151
  if (!ok)
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   152
    {
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   153
      return false;
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   154
    }
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   155
  DoSetOne (info->checker, *v);
2633
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   156
  return true;
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   157
}
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   158
void 
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   159
AttributeList::Reset (void)
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   160
{
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   161
  m_attributes.clear ();
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   162
}
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   163
AttributeList *
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   164
AttributeList::GetGlobal (void)
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   165
{
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   166
  return Singleton<AttributeList>::Get ();
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   167
}
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   168
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   169
std::string
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   170
AttributeList::LookupAttributeFullNameByChecker (Ptr<const AttributeChecker> checker) const
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   171
{
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   172
  for (uint32_t i = 0; i < TypeId::GetRegisteredN (); i++)
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   173
    {
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   174
      TypeId tid = TypeId::GetRegistered (i);
2693
56e28e34e109 TypeId::GetAttributeListN -> TypeId::GetAttributeN
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2671
diff changeset
   175
      for (uint32_t j = 0; j < tid.GetAttributeN (); j++)
2633
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   176
        {
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   177
          if (checker == tid.GetAttributeChecker (j))
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   178
            {
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   179
              return tid.GetAttributeFullName (j);
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   180
            }
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   181
        }
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   182
    }
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   183
  NS_FATAL_ERROR ("Could not find requested Accessor.");
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   184
  // quiet compiler.
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   185
  return "";
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   186
}
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   187
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   188
std::string 
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   189
AttributeList::SerializeToString (void) const
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   190
{
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   191
  std::ostringstream oss;
2957
8a87a9734bd6 avoid trailing |
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2834
diff changeset
   192
  for (Attrs::const_iterator i = m_attributes.begin (); i != m_attributes.end ();)
2633
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   193
    {
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   194
      std::string name = LookupAttributeFullNameByChecker (i->checker);
2965
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2957
diff changeset
   195
      oss << name << "=" << i->value->SerializeToString (i->checker);
2957
8a87a9734bd6 avoid trailing |
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2834
diff changeset
   196
      i++;
2633
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   197
      if (i != m_attributes.end ())
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   198
        {
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   199
          oss << "|";
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   200
        }
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   201
    }  
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   202
  return oss.str ();
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   203
}
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   204
bool 
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   205
AttributeList::DeserializeFromString (std::string str)
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   206
{
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   207
  Reset ();
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   208
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   209
  std::string::size_type cur;
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   210
  cur = 0;
4252
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   211
  while (cur != str.size ())
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   212
    {
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   213
      std::string::size_type equal = str.find ("=", cur);
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   214
      if (equal == std::string::npos)
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   215
        {
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   216
          NS_FATAL_ERROR ("Error while parsing serialized attribute: \"" << str << "\"");
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   217
          break;
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   218
        }
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   219
      else
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   220
        {
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   221
          std::string name = str.substr (cur, equal-cur);
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   222
          struct TypeId::AttributeInfo info;
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   223
          if (!TypeId::LookupAttributeByFullName (name, &info))
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   224
            {
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   225
              NS_FATAL_ERROR ("Error while parsing serialized attribute: name does not exist: \"" << name << "\"");
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   226
              break;
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   227
            }
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   228
          else
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   229
            {
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   230
              std::string::size_type next = str.find ("|", cur);
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   231
              std::string value;
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   232
              if (next == std::string::npos)
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   233
                {
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   234
                  value = str.substr (equal+1, str.size () - (equal+1));
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   235
                  cur = str.size ();
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   236
                }
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   237
              else
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   238
                {
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   239
                  value = str.substr (equal+1, next - (equal+1));
4600
d62a149c4b70 bug 607: AttributeList::Deserialize buggy
Ma Keith <keith.nwsuaf@gmail.com>
parents: 4252
diff changeset
   240
                  cur = next + 1;
4252
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   241
                }
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   242
              Ptr<AttributeValue> val = info.checker->Create ();
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   243
              bool ok = val->DeserializeFromString (value, info.checker);
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   244
              if (!ok)
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   245
                {
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   246
                  NS_FATAL_ERROR ("Error while parsing serialized attribute: value invalid: \"" << value << "\"");
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   247
                  break;
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   248
                }
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   249
              else
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   250
                {
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   251
                  DoSetOne (info.checker, *val);
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   252
                }
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   253
            }
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   254
        }
c82988c68a35 handle zero-size attribute list.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3892
diff changeset
   255
    }
2633
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   256
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   257
  return true;
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   258
}
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   259
3892
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   260
UnsafeAttributeList::UnsafeAttributeList ()
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   261
{}
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   262
UnsafeAttributeList::UnsafeAttributeList (const UnsafeAttributeList &o)
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   263
{
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   264
  for (uint32_t i = 0; i < o.m_attributes.size (); ++i)
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   265
    {
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   266
      Set (o.m_attributes[i].first, *(o.m_attributes[i].second));
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   267
    }
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   268
}
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   269
UnsafeAttributeList &
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   270
UnsafeAttributeList::operator = (const UnsafeAttributeList &o)
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   271
{
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   272
  m_attributes.clear ();
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   273
  for (uint32_t i = 0; i < o.m_attributes.size (); ++i)
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   274
    {
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   275
      Set (o.m_attributes[i].first, *(o.m_attributes[i].second));
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   276
    }
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   277
  return *this;
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   278
}
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   279
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   280
UnsafeAttributeList::~UnsafeAttributeList ()
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   281
{
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   282
  m_attributes.clear ();
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   283
}
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   284
void 
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   285
UnsafeAttributeList::Set (std::string name, const AttributeValue &param)
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   286
{
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   287
  if (name == "")
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   288
    {
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   289
      return;
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   290
    }
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   291
  for (uint32_t i = 0; i < m_attributes.size (); ++i)
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   292
    {
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   293
      if (m_attributes[i].first == name)
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   294
        {
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   295
          m_attributes[i].second = param.Copy ();
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   296
          return;
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   297
        }
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   298
    }
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   299
  m_attributes.push_back (std::make_pair (name, param.Copy ()));
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   300
}
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   301
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   302
AttributeList 
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   303
UnsafeAttributeList::GetSafe (std::string tidName) const
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   304
{
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   305
  AttributeList list;
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   306
  for (uint32_t i = 0; i < m_attributes.size (); ++i)
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   307
    {
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   308
      TypeId tid = TypeId::LookupByName (tidName);
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   309
      list.SetWithTid (tid, m_attributes[i].first, *m_attributes[i].second);
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   310
    }
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   311
  return list;
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   312
}
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   313
f985e116b696 add UnsafeAttributeList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3190
diff changeset
   314
2633
a0639de8cd8b split code from object.h/object.cc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   315
} // namespace ns3