Separating interface and implementation of FIB. Right now everything is
kind of broken.
diff --git a/model/ccnx-fib.h b/model/ccnx-fib.h
index 1baaf6f..31fd2d8 100644
--- a/model/ccnx-fib.h
+++ b/model/ccnx-fib.h
@@ -21,23 +21,10 @@
 #ifndef _CCNX_FIB_H_
 #define	_CCNX_FIB_H_
 
-#include "ccnx-name-components-hash-helper.h"
-#include "ccnx-face.h"
-#include "ccnx.h"
-#include "ns3/nstime.h"
 #include "ns3/simple-ref-count.h"
 #include "ns3/node.h"
 
-#include <boost/multi_index_container.hpp>
-#include <boost/multi_index/tag.hpp>
-#include <boost/multi_index/ordered_index.hpp>
-#include <boost/multi_index/composite_key.hpp>
-#include <boost/multi_index/hashed_index.hpp>
-#include <boost/multi_index/random_access_index.hpp>
-#include <boost/multi_index/member.hpp>
-#include <boost/multi_index/mem_fun.hpp>
-
-#include <iostream>
+#include "ns3/ccnx-fib-entry.h"
 
 namespace ns3 {
 
@@ -45,242 +32,24 @@
 
 /**
  * \ingroup ccnx
- * \brief Structure holding various parameters associated with a (FibEntry, Face) tuple
- */
-class CcnxFibFaceMetric
-{
-public:
-  /**
-   * @brief Color codes for FIB face status
-   */
-  enum Status { NDN_FIB_GREEN = 1,
-                NDN_FIB_YELLOW = 2,
-                NDN_FIB_RED = 3 };
-public:
-  /**
-   * \brief Metric constructor
-   *
-   * \param face Face for which metric
-   * \param cost Initial value for routing cost
-   */
-  CcnxFibFaceMetric (Ptr<CcnxFace> face, int32_t cost)
-    : m_face (face)
-    , m_status (NDN_FIB_YELLOW)
-    , m_routingCost (cost)
-    , m_sRtt   (Seconds (0))
-    , m_rttVar (Seconds (0))
-  { }
-
-  /**
-   * \brief Comparison operator used by boost::multi_index::identity<>
-   */
-  bool
-  operator< (const CcnxFibFaceMetric &fm) const { return *m_face < *fm.m_face; } // return identity of the face
-
-  /**
-   * @brief Comparison between CcnxFibFaceMetric and CcnxFace
-   */
-  bool
-  operator< (const Ptr<CcnxFace> &face) const { return *m_face < *face; } 
-
-  /**
-   * @brief Return CcnxFace associated with CcnxFibFaceMetric
-   */
-  Ptr<CcnxFace>
-  GetFace () const { return m_face; }
-
-  /**
-   * \brief Recalculate smoothed RTT and RTT variation
-   * \param rttSample RTT sample
-   */
-  void
-  UpdateRtt (const Time &rttSample);
-  
-private:
-  friend std::ostream& operator<< (std::ostream& os, const CcnxFibFaceMetric &metric);
-public:
-  Ptr<CcnxFace> m_face; ///< Face
-  
-  Status m_status;		///< \brief Status of the next hop: 
-				///<		- NDN_FIB_GREEN
-				///<		- NDN_FIB_YELLOW
-				///<		- NDN_FIB_RED
-  
-  int32_t m_routingCost; ///< \brief routing protocol cost (interpretation of the value depends on the underlying routing protocol)
-
-  Time m_sRtt;         ///< \brief smoothed round-trip time
-  Time m_rttVar;       ///< \brief round-trip time variation
-};
-
-/**
- * \ingroup ccnx
- * \brief Typedef for indexed face container of CcnxFibEntry
- *
- * Currently, there are 2 indexes:
- * - by face (used to find record and update metric)
- * - by metric (face ranking)
- * - random access index (for fast lookup on nth face). Order is
- *   maintained manually to be equal to the 'by metric' order
- */
-struct CcnxFibFaceMetricContainer
-{
-  /// @cond include_hidden
-  typedef boost::multi_index::multi_index_container<
-    CcnxFibFaceMetric,
-    boost::multi_index::indexed_by<
-      // For fast access to elements using CcnxFace
-      boost::multi_index::ordered_unique<
-        boost::multi_index::tag<__ccnx_private::i_face>,
-        boost::multi_index::member<CcnxFibFaceMetric,Ptr<CcnxFace>,&CcnxFibFaceMetric::m_face>
-      >,
-
-      // List of available faces ordered by (status, m_routingCost)
-      boost::multi_index::ordered_non_unique<
-        boost::multi_index::tag<__ccnx_private::i_metric>,
-        boost::multi_index::composite_key<
-          CcnxFibFaceMetric,
-          boost::multi_index::member<CcnxFibFaceMetric,CcnxFibFaceMetric::Status,&CcnxFibFaceMetric::m_status>,
-          boost::multi_index::member<CcnxFibFaceMetric,int32_t,&CcnxFibFaceMetric::m_routingCost>
-        >
-      >,
-
-      // To optimize nth candidate selection (sacrifice a little bit space to gain speed)
-      boost::multi_index::random_access<
-        boost::multi_index::tag<__ccnx_private::i_nth>
-      >
-    >
-   > type;
-  /// @endcond
-};
-
-/**
- * \ingroup ccnx
- * \brief Structure for FIB table entry, holding indexed list of
- *        available faces and their respective metrics
- */
-class CcnxFibEntry // : public SimpleRefCount<CcnxFibEntry>
-{
-public:
-  class NoFaces {}; ///< @brief Exception class for the case when FIB entry is not found
-  
-  /**
-   * \brief Constructor
-   * \param prefix smart pointer to the prefix for the FIB entry
-   */
-  CcnxFibEntry (const Ptr<const CcnxNameComponents> &prefix)
-  : m_prefix (prefix)
-  , m_needsProbing (false)
-  { }
-  
-  /**
-   * \brief Update status of FIB next hop
-   * \param status Status to set on the FIB entry
-   */
-  void UpdateStatus (Ptr<CcnxFace> face, CcnxFibFaceMetric::Status status);
-
-  /**
-   * \brief Add or update routing metric of FIB next hop
-   *
-   * Initial status of the next hop is set to YELLOW
-   */
-  void AddOrUpdateRoutingMetric (Ptr<CcnxFace> face, int32_t metric);
-
-  /**
-   * @brief Invalidate face
-   *
-   * Set routing metric on all faces to max and status to RED
-   */
-  void
-  Invalidate ();
-
-  /**
-   * @brief Update RTT averages for the face
-   */
-  void
-  UpdateFaceRtt (Ptr<CcnxFace> face, const Time &sample);
-  
-  /**
-   * \brief Get prefix for the FIB entry
-   */
-  const CcnxNameComponents&
-  GetPrefix () const { return *m_prefix; }
-
-  /**
-   * \brief Find "best route" candidate, skipping `skip' first candidates (modulo # of faces)
-   *
-   * throws CcnxFibEntry::NoFaces if m_faces.size()==0
-   */
-  const CcnxFibFaceMetric &
-  FindBestCandidate (uint32_t skip = 0) const;
-
-  /**
-   * @brief Remove record associated with `face`
-   */
-  void
-  RemoveFace (const Ptr<CcnxFace> &face)
-  {
-    m_faces.erase (face);
-  }
-	
-private:
-  friend std::ostream& operator<< (std::ostream& os, const CcnxFibEntry &entry);
-
-public:
-  Ptr<const CcnxNameComponents> m_prefix; ///< \brief Prefix of the FIB entry
-  CcnxFibFaceMetricContainer::type m_faces; ///< \brief Indexed list of faces
-
-  bool m_needsProbing;      ///< \brief flag indicating that probing should be performed 
-};
-
-///////////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////////
-
-/**
- * \ingroup ccnx
- * \brief Typedef for indexed container for FIB entries
- *
- * Currently, there is only one index
- * - by prefix hash, which is used to perform prefix match
- */
-struct CcnxFibEntryContainer 
-{
-  /// @cond include_hidden
-  typedef boost::multi_index::multi_index_container<
-    CcnxFibEntry,
-    boost::multi_index::indexed_by<
-      // For fast access to elements using CcnxFace
-      boost::multi_index::hashed_unique<
-        boost::multi_index::tag<__ccnx_private::i_prefix>,
-        boost::multi_index::const_mem_fun<CcnxFibEntry,
-                                          const CcnxNameComponents&,
-                                          &CcnxFibEntry::GetPrefix>,
-        CcnxPrefixHash>
-      >
-    > type;
-  /// @endcond
-};
-
-/**
- * \ingroup ccnx
  * \brief Class implementing FIB functionality
  */
 class CcnxFib : public Object
 {
 public:
-  typedef CcnxFibEntryContainer::type::iterator iterator;
+  typedef ns3::Ptr<CcnxFibEntry> iterator; // not sure, but let's see what will happen
+  typedef ns3::Ptr<CcnxFibEntry> const_iterator;
+
+  /**
+   * @brief Default constructor
+   */
+  CcnxFib () {}
   
   /**
-   * \brief Interface ID
-   *
-   * \return interface ID
+   * @brief Virtual destructor
    */
-  static TypeId GetTypeId ();
-
-  /**
-   * \brief Constructor
-   */
-  CcnxFib ();
-
+  virtual ~CcnxFib () { };
+  
   /**
    * \brief Perform longest prefix match
    *
@@ -289,8 +58,8 @@
    * \param interest Interest packet header
    * \returns If entry found a valid iterator will be returned, otherwise end ()
    */
-  CcnxFibEntryContainer::type::iterator
-  LongestPrefixMatch (const CcnxInterestHeader &interest) const;
+  virtual iterator
+  LongestPrefixMatch (const CcnxInterestHeader &interest) const = 0;
   
   /**
    * \brief Add or update FIB entry
@@ -303,8 +72,8 @@
    * @param face	Forwarding face
    * @param metric	Routing metric
    */
-  CcnxFibEntryContainer::type::iterator
-  Add (const CcnxNameComponents &prefix, Ptr<CcnxFace> face, int32_t metric);
+  virtual iterator
+  Add (const CcnxNameComponents &prefix, Ptr<CcnxFace> face, int32_t metric) = 0;
 
   /**
    * \brief Add or update FIB entry using smart pointer to prefix
@@ -317,8 +86,8 @@
    * @param face	Forwarding face
    * @param metric	Routing metric
    */
-  CcnxFibEntryContainer::type::iterator
-  Add (const Ptr<const CcnxNameComponents> &prefix, Ptr<CcnxFace> face, int32_t metric);
+  virtual iterator
+  Add (const Ptr<const CcnxNameComponents> &prefix, Ptr<CcnxFace> face, int32_t metric) = 0;
 
   /**
    * @brief Remove FIB entry
@@ -328,8 +97,8 @@
    *
    * @param name	Smart pointer to prefix
    */
-  void
-  Remove (const Ptr<const CcnxNameComponents> &prefix);
+  virtual void
+  Remove (const Ptr<const CcnxNameComponents> &prefix) = 0;
 
   /**
    * @brief Invalidate FIB entry ("Safe" version of Remove)
@@ -337,51 +106,54 @@
    * All faces for the entry will be assigned maximum routing metric and NDN_FIB_RED status   
    * @param name	Smart pointer to prefix
    */
-  void
-  Invalidate (const Ptr<const CcnxNameComponents> &prefix);
+  virtual void
+  Invalidate (const Ptr<const CcnxNameComponents> &prefix) = 0;
 
   /**
    * @brief Invalidate all FIB entries
    */
-  void
-  InvalidateAll ();
+  virtual void
+  InvalidateAll () = 0;
   
   /**
    * @brief Remove reference to a face from the entry. If entry had only this face, the whole
    * entry will be removed
    */
-  void
-  Remove (const CcnxFibEntry &entry, Ptr<CcnxFace> face);
+  virtual void
+  Remove (const CcnxFibEntry &entry, Ptr<CcnxFace> face) = 0;
 
   /**
    * @brief Remove all references to a face from FIB.  If for some enty that face was the only element,
    * this FIB entry will be removed.
    */
-  void
-  RemoveFromAll (Ptr<CcnxFace> face);
+  virtual void
+  RemoveFromAll (Ptr<CcnxFace> face) = 0;
 
-public:
-  CcnxFibEntryContainer::type m_fib; ///< @brief Internal container
-
-protected:
-  // inherited from Object class
-  virtual void NotifyNewAggregate (); ///< @brief Notify when object is aggregated
-  virtual void DoDispose (); ///< @brief Perform cleanup
+  /**
+   * @brief Print out entries in FIB
+   */
+  virtual void
+  Print (std::ostream &os) const = 0;
+  
+  // /**
+  //  * @brief Modify element in container
+  //  */
+  // template<typename Modifier>
+  // virtual bool
+  // modify (iterator position, Modifier mod) = 0;
+  // // {
+  // //   return this->m_fib.modify (position, mod);
+  // // }
   
 private:
   friend std::ostream& operator<< (std::ostream& os, const CcnxFib &fib);
   CcnxFib(const CcnxFib&) {} ; ///< \brief copy constructor is disabled
-  
-private:
-  Ptr<Node> m_node;
 };
 
 ///////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////
 
 std::ostream& operator<< (std::ostream& os, const CcnxFib &fib);
-std::ostream& operator<< (std::ostream& os, const CcnxFibEntry &entry);
-std::ostream& operator<< (std::ostream& os, const CcnxFibFaceMetric &metric);
  
 } // namespace ns3