change GridTopology API and add RandomRectangle topology with similar API.

This commit is contained in:
Mathieu Lacage
2007-07-03 10:04:16 +02:00
parent 94c1f03300
commit 9a89cf1978
6 changed files with 175 additions and 42 deletions

View File

@@ -249,6 +249,7 @@ node.add_sources ([
'static-position.cc',
'static-speed-position.cc',
'grid-topology.cc',
'random-rectangle-topology.cc',
'random-walk-position.cc',
])
node.add_inst_headers ([
@@ -272,6 +273,7 @@ node.add_inst_headers ([
'static-position.h',
'static-speed-position.h',
'grid-topology.h',
'random-rectangle-topology.h',
'random-walk-position.h',
])

View File

@@ -31,8 +31,7 @@ int main (int argc, char *argv[])
// finalize the setup by attaching to each object
// in the input array a position and initializing
// this position with the calculated coordinates.
grid.ArrangeHorizontally (nodes);
grid.LayoutRowFirst (nodes.begin (), nodes.end ());
// iterate our nodes and print their position.
for (std::vector<Ptr<Object> >::const_iterator j = nodes.begin ();

View File

@@ -39,51 +39,22 @@ GridTopology::SetPositionModel (ClassId classId)
}
void
GridTopology::ArrangeHorizontally (std::vector<Ptr<Object> > objects)
GridTopology::LayoutOneRowFirst (Ptr<Object> object, uint32_t i)
{
double x, y;
uint32_t col;
x = m_xMin;
y = m_yMin;
col = 0;
for (std::vector<Ptr<Object> >::const_iterator i = objects.begin ();
i != objects.end (); i++)
{
Ptr<Object> object = *i;
object->AddInterface (ComponentManager::Create (m_positionClassId, x, y));
x += m_deltaX;
col++;
if (col == m_n)
{
col = 0;
x = m_xMin;
y += m_deltaY;
}
}
x = m_xMin + m_deltaX * (i % m_n);
y = m_yMin + m_deltaY * (i / m_n);
object->AddInterface (ComponentManager::Create (m_positionClassId, x, y));
}
void
GridTopology::ArrangeVertically (std::vector<Ptr<Object> > objects)
GridTopology::LayoutOneColumnFirst (Ptr<Object> object, uint32_t i)
{
double x, y;
uint32_t row;
x = m_xMin;
y = m_yMin;
row = 0;
for (std::vector<Ptr<Object> >::const_iterator i = objects.begin ();
i != objects.end (); i++)
{
Ptr<Object> object = *i;
object->AddInterface (ComponentManager::Create (m_positionClassId, x, y));
y += m_deltaY;
row++;
if (row == m_n)
{
row = 0;
y = m_yMin;
x += m_deltaX;
}
}
x = m_xMin + m_deltaX * (i / m_n);
y = m_yMin + m_deltaY * (i % m_n);
object->AddInterface (ComponentManager::Create (m_positionClassId, x, y));
}
} // namespace ns3

View File

@@ -59,7 +59,8 @@ class GridTopology
* of coordinates arranged according to a regular rectangular grid,
* one row after the other.
*/
void ArrangeHorizontally (std::vector<Ptr<Object> > objects);
template <typename T>
void LayoutRowFirst (const T &begin, const T &end);
/**
* \param objects a vector of objects
@@ -70,9 +71,12 @@ class GridTopology
* of coordinates arranged according to a regular rectangular grid,
* one column after the other.
*/
void ArrangeVertically (std::vector<Ptr<Object> > objects);
template <typename T>
void LayoutColumnFirst (const T &begin, const T &end);
private:
GridTopology ();
void LayoutOneRowFirst (Ptr<Object> object, uint32_t i);
void LayoutOneColumnFirst (Ptr<Object> object, uint32_t i);
double m_xMin;
double m_yMin;
uint32_t m_n;
@@ -83,4 +87,32 @@ class GridTopology
} // namespace ns3
namespace ns3 {
template <typename T>
void
GridTopology::LayoutRowFirst (const T &begin, const T &end)
{
uint32_t j = 0;
for (T i = begin; i != end; i++)
{
j++;
LayoutOneRowFirst (*i, j);
}
}
template <typename T>
void
GridTopology::LayoutColumnFirst (const T &begin, const T &end)
{
uint32_t j = 0;
for (T i = begin; i != end; i++)
{
j++;
LayoutOneColumnFirst (*i, j);
}
}
} // namespace ns3
#endif /* GRID_TOPOLOGY_H */

View File

@@ -0,0 +1,60 @@
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2007 INRIA
* All rights reserved.
*
* 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>
*/
#include "random-rectangle-topology.h"
#include "static-position.h"
namespace ns3 {
RandomRectangleTopology::RandomRectangleTopology (double xMin, double xMax, double yMin, double yMax)
: m_xVariable (new UniformVariable (xMin, xMax)),
m_yVariable (new UniformVariable (yMin, yMax)),
m_positionModel (StaticPosition::cid)
{}
RandomRectangleTopology::RandomRectangleTopology (const RandomVariable &xVariable,
const RandomVariable &yVariable)
: m_xVariable (xVariable.Copy ()),
m_yVariable (yVariable.Copy ()),
m_positionModel (StaticPosition::cid)
{}
RandomRectangleTopology::~RandomRectangleTopology ()
{
delete m_xVariable;
delete m_yVariable;
m_xVariable = 0;
m_yVariable = 0;
}
void
RandomRectangleTopology::SetPositionModel (ClassId classId)
{
m_positionModel = classId;
}
void
RandomRectangleTopology::LayoutOne (Ptr<Object> object)
{
double x = m_xVariable->GetValue ();
double y = m_yVariable->GetValue ();
object->AddInterface (ComponentManager::Create (m_positionModel, x, y));
}
} // namespace ns3

View File

@@ -0,0 +1,69 @@
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2007 INRIA
* All rights reserved.
*
* 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 RANDOM_RECTANGLE_TOPOLOGY_H
#define RANDOM_RECTANGLE_TOPOLOGY_H
#include "ns3/random-variable.h"
#include "ns3/ptr.h"
#include "ns3/object.h"
#include "ns3/component-manager.h"
namespace ns3 {
class RandomRectangleTopology
{
public:
RandomRectangleTopology (double xMin, double xMax, double yMin, double yMax);
RandomRectangleTopology (const RandomVariable &xVariable, const RandomVariable &yVariable);
~RandomRectangleTopology ();
void SetPositionModel (ClassId classId);
void LayoutOne (Ptr<Object> object);
template <typename T>
void Layout (const T &begin, const T &end);
private:
RandomVariable *m_xVariable;
RandomVariable *m_yVariable;
ClassId m_positionModel;
};
} // namespace ns3
namespace ns3 {
template <typename T>
void
RandomRectangleTopology::Layout (const T &begin, const T &end)
{
for (T i = begin; i != end; i++)
{
LayoutOne (*i);
}
}
} // namespace ns3
#endif /* RANDOM_RECTANGLE_TOPOLOGY_H */