zipf: Small changes (style and small logic correction) and adding documentation section
diff --git a/apps/ndn-consumer-zipf-mandelbrot.cc b/apps/ndn-consumer-zipf-mandelbrot.cc
index d744143..1fc8d45 100644
--- a/apps/ndn-consumer-zipf-mandelbrot.cc
+++ b/apps/ndn-consumer-zipf-mandelbrot.cc
@@ -24,7 +24,6 @@
 #include "ns3/ndn-interest.h"
 #include "ns3/ndn-content-object.h"
 #include <math.h>
-//#include <random-variable.h>
 
 
 NS_LOG_COMPONENT_DEFINE ("ndn.ConsumerZipfMandelbrot");
@@ -41,18 +40,22 @@
     .SetGroupName ("Ndn")
     .SetParent<ConsumerCbr> ()
     .AddConstructor<ConsumerZipfMandelbrot> ()
-    .AddAttribute ("N", "Number of the Contents in total",
-                      StringValue ("100"),
-                      MakeUintegerAccessor (&ConsumerZipfMandelbrot::m_N),
-                      MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("q", "parameter of improve rank",
-                      StringValue ("0.7"),
-                      MakeDoubleAccessor (&ConsumerZipfMandelbrot::m_q),
-                      MakeDoubleChecker<double>())
-	  .AddAttribute ("s", "parameter of power",
-							StringValue ("0.7"),
-							MakeDoubleAccessor (&ConsumerZipfMandelbrot::m_s),
-							MakeDoubleChecker<double>())
+
+    .AddAttribute ("NumberOfContents", "Number of the Contents in total",
+                   StringValue ("100"),
+                   MakeUintegerAccessor (&ConsumerZipfMandelbrot::SetNumberOfContents, &ConsumerZipfMandelbrot::GetNumberOfContents),
+                   MakeUintegerChecker<uint32_t> ())
+
+    // Alex: q and s are not yet really working
+    //
+    // .AddAttribute ("q", "parameter of improve rank",
+    //                StringValue ("0.7"),
+    //                MakeDoubleAccessor (&ConsumerZipfMandelbrot::m_q),
+    //                MakeDoubleChecker<double>())
+    // .AddAttribute ("s", "parameter of power",
+    //                StringValue ("0.7"),
+    //                MakeDoubleAccessor (&ConsumerZipfMandelbrot::m_s),
+    //                MakeDoubleChecker<double>())
     ;
 
   return tid;
@@ -60,149 +63,162 @@
 
 
 ConsumerZipfMandelbrot::ConsumerZipfMandelbrot()
-	: m_N(100)
-	, m_q (0.7)
-	, m_s (0.7)
+  : m_q (0.7)
+  , m_s (0.7)
+  , m_SeqRng (0.0, 1.0)
 {
-	m_Pcum = new double[m_N+1];
-	m_Pcum[0] = 0.0;
-	for (uint32_t i=1; i<=m_N; i++) {
-		m_Pcum[i] = m_Pcum[i-1] + 1.0/pow(i+m_q, m_s);
-	}
-	for (uint32_t i=1; i<=m_N; i++) {
-		m_Pcum[i] = m_Pcum[i] / m_Pcum[m_N];
-		NS_LOG_LOGIC("cum Probability ["<<i<<"]="<<m_Pcum[i]);
-	}
-	//Ptr<UniformRandomVariable> m_SeqRng = CreateObject<UniformRandomVariable> ();
-	m_SeqRng = new UniformVariable(0.0, 1.0); //[1, m_N+1)
-	//m_SeqRng = new UniformVariable ();
+  // SetNumberOfContents is called by NS-3 object system during the initialization
 }
 
-ConsumerZipfMandelbrot::~ConsumerZipfMandelbrot() {
-	if (m_Pcum) {
-		delete m_Pcum;
-		m_Pcum = NULL;
-	}
-//	if (m_SeqRng) {
-//		delete m_SeqRng;
-//		m_SeqRng = NULL;
-//	}
+ConsumerZipfMandelbrot::~ConsumerZipfMandelbrot()
+{
 }
 
 void
+ConsumerZipfMandelbrot::SetNumberOfContents (uint32_t numOfContents)
+{
+  m_N = numOfContents;
+
+  m_Pcum = std::vector<double> (m_N + 1);
+
+  m_Pcum[0] = 0.0;
+  for (uint32_t i=1; i<=m_N; i++)
+    {
+      m_Pcum[i] = m_Pcum[i-1] + 1.0/pow(i+m_q, m_s);
+    }
+  
+  for (uint32_t i=1; i<=m_N; i++)
+    {
+      m_Pcum[i] = m_Pcum[i] / m_Pcum[m_N];
+      NS_LOG_LOGIC("cum Probability ["<<i<<"]="<<m_Pcum[i]);
+  }
+}
+
+uint32_t
+ConsumerZipfMandelbrot::GetNumberOfContents () const
+{
+  return m_N;
+}
+
+
+void
 ConsumerZipfMandelbrot::SendPacket() {
-	  if (!m_active) return;
+  if (!m_active) return;
 
-	  NS_LOG_FUNCTION_NOARGS ();
+  NS_LOG_FUNCTION_NOARGS ();
 
-	  uint32_t seq=std::numeric_limits<uint32_t>::max (); //invalid
+  uint32_t seq=std::numeric_limits<uint32_t>::max (); //invalid
 
-	  // std::cout << Simulator::Now ().ToDouble (Time::S) << "s max -> " << m_seqMax << "\n";
+  // std::cout << Simulator::Now ().ToDouble (Time::S) << "s max -> " << m_seqMax << "\n";
 
-	  while (m_retxSeqs.size ())
-	    {
-	      seq = *m_retxSeqs.begin ();
-	      m_retxSeqs.erase (m_retxSeqs.begin ());
+  while (m_retxSeqs.size ())
+    {
+      seq = *m_retxSeqs.begin ();
+      m_retxSeqs.erase (m_retxSeqs.begin ());
 
-	      // NS_ASSERT (m_seqLifetimes.find (seq) != m_seqLifetimes.end ());
-	      // if (m_seqLifetimes.find (seq)->time <= Simulator::Now ())
-	      //   {
+      // NS_ASSERT (m_seqLifetimes.find (seq) != m_seqLifetimes.end ());
+      // if (m_seqLifetimes.find (seq)->time <= Simulator::Now ())
+      //   {
 
-	      //     NS_LOG_DEBUG ("Expire " << seq);
-	      //     m_seqLifetimes.erase (seq); // lifetime expired. Trying to find another unexpired sequence number
-	      //     continue;
-	      //   }
-	      NS_LOG_DEBUG("=interest seq "<<seq<<" from m_retxSeqs");
-	      break;
-	    }
+      //     NS_LOG_DEBUG ("Expire " << seq);
+      //     m_seqLifetimes.erase (seq); // lifetime expired. Trying to find another unexpired sequence number
+      //     continue;
+      //   }
+      NS_LOG_DEBUG("=interest seq "<<seq<<" from m_retxSeqs");
+      break;
+    }
 
-	  if (seq == std::numeric_limits<uint32_t>::max ()) //no retransmission
-	    {
-	      if (m_seqMax != std::numeric_limits<uint32_t>::max ())
-	        {
-	          if (m_seq >= m_seqMax)
-	            {
-	              return; // we are totally done
-	            }
-	        }
+  if (seq == std::numeric_limits<uint32_t>::max ()) //no retransmission
+    {
+      if (m_seqMax != std::numeric_limits<uint32_t>::max ())
+        {
+          if (m_seq >= m_seqMax)
+            {
+              return; // we are totally done
+            }
+        }
 
-	      seq = ConsumerZipfMandelbrot::GetNextSeq();
-	      m_seq ++;
-	    }
+      seq = ConsumerZipfMandelbrot::GetNextSeq();
+      m_seq ++;
+    }
 
-	  // std::cout << Simulator::Now ().ToDouble (Time::S) << "s -> " << seq << "\n";
+  // std::cout << Simulator::Now ().ToDouble (Time::S) << "s -> " << seq << "\n";
 
-	  //
-	  Ptr<NameComponents> nameWithSequence = Create<NameComponents> (m_interestName);
-	  (*nameWithSequence) (seq);
-	  //
+  //
+  Ptr<NameComponents> nameWithSequence = Create<NameComponents> (m_interestName);
+  (*nameWithSequence) (seq);
+  //
 
-	  InterestHeader interestHeader;
-	  interestHeader.SetNonce               (m_rand.GetValue ());
-	  interestHeader.SetName                (nameWithSequence);
+  InterestHeader interestHeader;
+  interestHeader.SetNonce (m_rand.GetValue ());
+  interestHeader.SetName  (nameWithSequence);
 
-	  // NS_LOG_INFO ("Requesting Interest: \n" << interestHeader);
-	  NS_LOG_INFO ("> Interest for " << seq<<", Total: "<<m_seq<<", face: "<<m_face->GetId());
+  // NS_LOG_INFO ("Requesting Interest: \n" << interestHeader);
+  NS_LOG_INFO ("> Interest for " << seq<<", Total: "<<m_seq<<", face: "<<m_face->GetId());
 
-	  Ptr<Packet> packet = Create<Packet> ();
+  Ptr<Packet> packet = Create<Packet> ();
 
-	  //NS_LOG_DEBUG ("= Interest for " << seq<<", Total: "<<m_seq<<", face: "<<m_face->GetId());
-	  packet->AddHeader (interestHeader);
-	  //NS_LOG_DEBUG ("Interest packet size: " << packet->GetSize ());
+  //NS_LOG_DEBUG ("= Interest for " << seq<<", Total: "<<m_seq<<", face: "<<m_face->GetId());
+  packet->AddHeader (interestHeader);
+  //NS_LOG_DEBUG ("Interest packet size: " << packet->GetSize ());
 
-	  NS_LOG_DEBUG ("Trying to add " << seq << " with " << Simulator::Now () << ". already " << m_seqTimeouts.size () << " items");
+  NS_LOG_DEBUG ("Trying to add " << seq << " with " << Simulator::Now () << ". already " << m_seqTimeouts.size () << " items");
 
-	  m_seqTimeouts.insert (SeqTimeout (seq, Simulator::Now ()));
-	  m_seqLifetimes.insert (SeqTimeout (seq, Simulator::Now () + m_interestLifeTime)); // only one insert will work. if entry exists, nothing will happen... nothing should happen
-	  m_transmittedInterests (&interestHeader, this, m_face);
+  m_seqTimeouts.insert (SeqTimeout (seq, Simulator::Now ()));
+  m_seqLifetimes.insert (SeqTimeout (seq, Simulator::Now () + m_interestLifeTime)); // only one insert will work. if entry exists, nothing will happen... nothing should happen
+  m_transmittedInterests (&interestHeader, this, m_face);
 
-	  m_rtt->SentSeq (SequenceNumber32 (seq), 1);
+  m_rtt->SentSeq (SequenceNumber32 (seq), 1);
 
-	  m_protocolHandler (packet);
+  m_protocolHandler (packet);
 
-	 ConsumerZipfMandelbrot::ScheduleNextPacket ();
+  ConsumerZipfMandelbrot::ScheduleNextPacket ();
 }
 
 
 uint32_t
-ConsumerZipfMandelbrot::GetNextSeq(){
-	uint32_t content_index = 1; //[1, m_N]
-	double p_sum = 0;
+ConsumerZipfMandelbrot::GetNextSeq()
+{
+  uint32_t content_index = 1; //[1, m_N]
+  double p_sum = 0;
 
-	double p_random = m_SeqRng->GetValue();
-	while (p_random == 0){
-		p_random = m_SeqRng->GetValue();
-	}
-	//if (p_random == 0)
-	NS_LOG_LOGIC("p_random="<<p_random);
-	for (uint32_t i=1; i<=m_N; i++) {
-		p_sum = m_Pcum[i];   //m_Pcum[i] = m_Pcum[i-1] + p[i], p[0] = 0;   e.g.: p_cum[1] = p[1], p_cum[2] = p[1] + p[2]
-		if (p_random <= p_sum) {
-			content_index = i;
-			break;
-		} //if
-	} //for
-	//content_index = 1;
-	NS_LOG_DEBUG("RandomNumber="<<content_index);
-	return content_index;
+  double p_random = m_SeqRng.GetValue();
+  while (p_random == 0)
+    {
+      p_random = m_SeqRng.GetValue();
+    }
+  //if (p_random == 0)
+  NS_LOG_LOGIC("p_random="<<p_random);
+  for (uint32_t i=1; i<=m_N; i++)
+    {
+      p_sum = m_Pcum[i];   //m_Pcum[i] = m_Pcum[i-1] + p[i], p[0] = 0;   e.g.: p_cum[1] = p[1], p_cum[2] = p[1] + p[2]
+      if (p_random <= p_sum)
+        {
+          content_index = i;
+          break;
+        } //if
+    } //for
+  //content_index = 1;
+  NS_LOG_DEBUG("RandomNumber="<<content_index);
+  return content_index;
 }
 
 void
 ConsumerZipfMandelbrot::ScheduleNextPacket() {
 
-	  if (m_firstTime)
-	    {
-	      m_sendEvent = Simulator::Schedule (Seconds (0.0),
-	                                         &ConsumerZipfMandelbrot::SendPacket, this);
-	      m_firstTime = false;
-	    }
-	  else if (!m_sendEvent.IsRunning ())
-	    m_sendEvent = Simulator::Schedule (
-	                                       (m_random == 0) ?
-	                                         Seconds(1.0 / m_frequency)
-	                                       :
-	                                         Seconds(m_random->GetValue ()),
-	                                       &ConsumerZipfMandelbrot::SendPacket, this);
+  if (m_firstTime)
+    {
+      m_sendEvent = Simulator::Schedule (Seconds (0.0),
+                                         &ConsumerZipfMandelbrot::SendPacket, this);
+      m_firstTime = false;
+    }
+  else if (!m_sendEvent.IsRunning ())
+    m_sendEvent = Simulator::Schedule (
+                                       (m_random == 0) ?
+                                       Seconds(1.0 / m_frequency)
+                                       :
+                                       Seconds(m_random->GetValue ()),
+                                       &ConsumerZipfMandelbrot::SendPacket, this);
 }
 
 } /* namespace ndn */