A Discrete-Event Network Simulator
API
global-value.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2008 INRIA
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 *
17 * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
18 */
19#include "global-value.h"
20
21#include "attribute.h"
23#include "fatal-error.h"
24#include "log.h"
25#include "string.h"
26#include "uinteger.h"
27
28#include "ns3/core-config.h"
29
36namespace ns3
37{
38
39NS_LOG_COMPONENT_DEFINE("GlobalValue");
40
41GlobalValue::GlobalValue(std::string name,
42 std::string help,
43 const AttributeValue& initialValue,
45 : m_name(name),
46 m_help(help),
47 m_initialValue(nullptr),
48 m_currentValue(nullptr),
49 m_checker(checker)
50{
51 NS_LOG_FUNCTION(name << help << &initialValue << checker);
52 if (!m_checker)
53 {
54 NS_FATAL_ERROR("Checker should not be zero on " << name);
55 }
56 m_initialValue = m_checker->CreateValidValue(initialValue);
58 if (!m_initialValue)
59 {
60 NS_FATAL_ERROR("Value set by user on " << name << " is invalid.");
61 }
62 GetVector()->push_back(this);
64}
65
66void
68{
69 NS_LOG_FUNCTION(this);
70
71 auto [found, value] = EnvironmentVariable::Get("NS_GLOBAL_VALUE", m_name);
72 if (found)
73 {
74 Ptr<AttributeValue> v = m_checker->CreateValidValue(StringValue(value));
75 if (v)
76 {
79 }
80 }
81}
82
83std::string
85{
87 return m_name;
88}
89
90std::string
92{
94 return m_help;
95}
96
97void
99{
101 bool ok = m_checker->Copy(*m_currentValue, value);
102 if (ok)
103 {
104 return;
105 }
106 StringValue* str = dynamic_cast<StringValue*>(&value);
107 if (str == nullptr)
108 {
109 NS_FATAL_ERROR("GlobalValue name=" << m_name << ": input value is not a string");
110 }
111 str->Set(m_currentValue->SerializeToString(m_checker));
112}
113
116{
117 NS_LOG_FUNCTION(this);
118
119 return m_checker;
120}
121
122bool
124{
126
127 Ptr<AttributeValue> v = m_checker->CreateValidValue(value);
128 if (!v)
129 {
130 return 0;
131 }
132 m_currentValue = v;
133 return true;
134}
135
136void
137GlobalValue::Bind(std::string name, const AttributeValue& value)
138{
139 NS_LOG_FUNCTION(name << &value);
140
141 for (Iterator i = Begin(); i != End(); i++)
142 {
143 if ((*i)->GetName() == name)
144 {
145 if (!(*i)->SetValue(value))
146 {
147 NS_FATAL_ERROR("Invalid new value for global value: " << name);
148 }
149 return;
150 }
151 }
152 NS_FATAL_ERROR("Non-existent global value: " << name);
153}
154
155bool
157{
158 NS_LOG_FUNCTION(name << &value);
159
160 for (Iterator i = Begin(); i != End(); i++)
161 {
162 if ((*i)->GetName() == name)
163 {
164 return (*i)->SetValue(value);
165 }
166 }
167 return false;
168}
169
172{
174
175 return GetVector()->begin();
176}
177
180{
182 return GetVector()->end();
183}
184
185void
187{
188 NS_LOG_FUNCTION(this);
190}
191
192bool
194{
195 NS_LOG_FUNCTION(name << &value);
196 for (GlobalValue::Iterator gvit = GlobalValue::Begin(); gvit != GlobalValue::End(); ++gvit)
197 {
198 if ((*gvit)->GetName() == name)
199 {
200 (*gvit)->GetValue(value);
201 return true;
202 }
203 }
204 return false; // not found
205}
206
207void
209{
210 NS_LOG_FUNCTION(name << &value);
211 if (!GetValueByNameFailSafe(name, value))
212 {
213 NS_FATAL_ERROR("Could not find GlobalValue named \"" << name << "\"");
214 }
215}
216
219{
221 static Vector vector;
222 return &vector;
223}
224
225} // namespace ns3
ns3::AttributeValue, ns3::AttributeAccessor and ns3::AttributeChecker declarations.
Hold a value for an Attribute.
Definition: attribute.h:70
static KeyFoundType Get(const std::string &envvar, const std::string &key="", const std::string &delim=";")
Get the value corresponding to a key from an environment variable.
Vector::const_iterator Iterator
Iterator type for the list of all global values.
Definition: global-value.h:82
std::string GetHelp() const
Get the help string.
Definition: global-value.cc:91
std::vector< GlobalValue * > Vector
Container type for holding all the GlobalValues.
Definition: global-value.h:78
void GetValue(AttributeValue &value) const
Get the value.
Definition: global-value.cc:98
static void Bind(std::string name, const AttributeValue &value)
Iterate over the set of GlobalValues until a matching name is found and then set its value with Globa...
static bool GetValueByNameFailSafe(std::string name, AttributeValue &value)
Finds the GlobalValue with the given name and returns its value.
static Iterator Begin()
The Begin iterator.
std::string GetName() const
Get the name.
Definition: global-value.cc:84
std::string m_help
The help string.
Definition: global-value.h:202
Ptr< const AttributeChecker > m_checker
The AttributeChecker for this GlobalValue.
Definition: global-value.h:208
Ptr< AttributeValue > m_currentValue
The current value.
Definition: global-value.h:206
bool SetValue(const AttributeValue &value)
Set the value of this GlobalValue.
static void GetValueByName(std::string name, AttributeValue &value)
Finds the GlobalValue with the given name and returns its value.
void ResetInitialValue()
Reset to the initial value.
static bool BindFailSafe(std::string name, const AttributeValue &value)
Iterate over the set of GlobalValues until a matching name is found and then set its value with Globa...
Ptr< const AttributeChecker > GetChecker() const
Get the AttributeChecker.
Ptr< AttributeValue > m_initialValue
The initial value.
Definition: global-value.h:204
static Iterator End()
The End iterator.
GlobalValue(std::string name, std::string help, const AttributeValue &initialValue, Ptr< const AttributeChecker > checker)
Constructor.
Definition: global-value.cc:41
std::string m_name
The name of this GlobalValue.
Definition: global-value.h:200
void InitializeFromEnv()
Initialize from the NS_GLOBAL_VALUE environment variable.
Definition: global-value.cc:67
static Vector * GetVector()
Get the static vector of all GlobalValues.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:78
Hold variables of type string.
Definition: string.h:56
void Set(const std::string &value)
Set the value.
Definition: string.cc:31
Class Environment declaration.
NS_FATAL_x macro definitions.
ns3::GlobalValue declaration.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:179
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
Debug message logging.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
value
Definition: second.py:41
ns3::StringValue attribute value declarations.
ns3::UintegerValue attribute value declarations and template implementations.