00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "enum.h"
00021 #include "fatal-error.h"
00022 #include <sstream>
00023
00024 namespace ns3 {
00025
00026 EnumValue::EnumValue ()
00027 : m_v ()
00028 {}
00029 EnumValue::EnumValue (int v)
00030 : m_v (v)
00031 {}
00032 void
00033 EnumValue::Set (int v)
00034 {
00035 m_v = v;
00036 }
00037 int
00038 EnumValue::Get (void) const
00039 {
00040 return m_v;
00041 }
00042 Ptr<AttributeValue>
00043 EnumValue::Copy (void) const
00044 {
00045 return ns3::Create<EnumValue> (*this);
00046 }
00047 std::string
00048 EnumValue::SerializeToString (Ptr<const AttributeChecker> checker) const
00049 {
00050 const EnumChecker *p = dynamic_cast<const EnumChecker *> (PeekPointer (checker));
00051 NS_ASSERT (p != 0);
00052 for (EnumChecker::ValueSet::const_iterator i = p->m_valueSet.begin (); i != p->m_valueSet.end (); i++)
00053 {
00054 if (i->first == m_v)
00055 {
00056 return i->second;
00057 }
00058 }
00059
00060 NS_FATAL_ERROR ("The user has set an invalid C++ value in this Enum");
00061
00062 return "";
00063 }
00064 bool
00065 EnumValue::DeserializeFromString (std::string value, Ptr<const AttributeChecker> checker)
00066 {
00067 const EnumChecker *p = dynamic_cast<const EnumChecker *> (PeekPointer (checker));
00068 NS_ASSERT (p != 0);
00069 for (EnumChecker::ValueSet::const_iterator i = p->m_valueSet.begin (); i != p->m_valueSet.end (); i++)
00070 {
00071 if (i->second == value)
00072 {
00073 m_v = i->first;
00074 return true;
00075 }
00076 }
00077 return false;
00078 }
00079
00080 EnumChecker::EnumChecker ()
00081 {}
00082
00083 void
00084 EnumChecker::AddDefault (int v, std::string name)
00085 {
00086 m_valueSet.push_front (std::make_pair (v, name));
00087 }
00088 void
00089 EnumChecker::Add (int v, std::string name)
00090 {
00091 m_valueSet.push_back (std::make_pair (v, name));
00092 }
00093 bool
00094 EnumChecker::Check (const AttributeValue &value) const
00095 {
00096 const EnumValue *p = dynamic_cast<const EnumValue *> (&value);
00097 if (p == 0)
00098 {
00099 return false;
00100 }
00101 for (ValueSet::const_iterator i = m_valueSet.begin (); i != m_valueSet.end (); i++)
00102 {
00103 if (i->first == p->Get ())
00104 {
00105 return true;
00106 }
00107 }
00108 return false;
00109 }
00110 std::string
00111 EnumChecker::GetValueTypeName (void) const
00112 {
00113 return "ns3::EnumValue";
00114 }
00115 bool
00116 EnumChecker::HasUnderlyingTypeInformation (void) const
00117 {
00118 return true;
00119 }
00120 std::string
00121 EnumChecker::GetUnderlyingTypeInformation (void) const
00122 {
00123 std::ostringstream oss;
00124 for (ValueSet::const_iterator i = m_valueSet.begin (); i != m_valueSet.end ();)
00125 {
00126 oss << i->second;
00127 i++;
00128 if (i != m_valueSet.end ())
00129 {
00130 oss << "|";
00131 }
00132 }
00133 return oss.str ();
00134 }
00135 Ptr<AttributeValue>
00136 EnumChecker::Create (void) const
00137 {
00138 return ns3::Create<EnumValue> ();
00139 }
00140
00141 bool
00142 EnumChecker::Copy (const AttributeValue &source, AttributeValue &destination) const
00143 {
00144 const EnumValue *src = dynamic_cast<const EnumValue *> (&source);
00145 EnumValue *dst = dynamic_cast<EnumValue *> (&destination);
00146 if (src == 0 || dst == 0)
00147 {
00148 return false;
00149 }
00150 *dst = *src;
00151 return true;
00152 }
00153
00154
00155 Ptr<const AttributeChecker>
00156 MakeEnumChecker (int v1, std::string n1,
00157 int v2, std::string n2,
00158 int v3, std::string n3,
00159 int v4, std::string n4,
00160 int v5, std::string n5,
00161 int v6, std::string n6,
00162 int v7, std::string n7,
00163 int v8, std::string n8,
00164 int v9, std::string n9,
00165 int v10, std::string n10,
00166 int v11, std::string n11,
00167 int v12, std::string n12)
00168 {
00169 Ptr<EnumChecker> checker = Create<EnumChecker> ();
00170 checker->AddDefault (v1, n1);
00171 if (n2 == "")
00172 {
00173 return checker;
00174 }
00175 checker->Add (v2, n2);
00176 if (n3 == "")
00177 {
00178 return checker;
00179 }
00180 checker->Add (v3, n3);
00181 if (n4 == "")
00182 {
00183 return checker;
00184 }
00185 checker->Add (v4, n4);
00186 if (n5 == "")
00187 {
00188 return checker;
00189 }
00190 checker->Add (v5, n5);
00191 if (n6 == "")
00192 {
00193 return checker;
00194 }
00195 checker->Add (v6, n6);
00196 if (n7 == "")
00197 {
00198 return checker;
00199 }
00200 checker->Add (v7, n7);
00201 if (n8 == "")
00202 {
00203 return checker;
00204 }
00205 checker->Add (v8, n8);
00206 if (n9 == "")
00207 {
00208 return checker;
00209 }
00210 checker->Add (v9, n9);
00211 if (n10 == "")
00212 {
00213 return checker;
00214 }
00215 checker->Add (v10, n10);
00216 if (n11 == "")
00217 {
00218 return checker;
00219 }
00220 checker->Add (v11, n11);
00221 if (n12 == "")
00222 {
00223 return checker;
00224 }
00225 checker->Add (v12, n12);
00226 return checker;
00227 }
00228
00229
00230 }