model: Adding "new" content store with ability to track lifetime of entries

Available options for ndnStackHelper.SetContentStore:
- ns3::ndn::cs::Stats::Lru
- ns3::ndn::cs::Stats::Random
- ns3::ndn::cs::Stats::Fifo

Tracked events include 0-lifetime entries, i.e., when entries are not stored at all.

Config::ConnectWithoutContext ("/NodeList/1/$ns3::ndn::cs::Stats::Random/WillRemoveEntry", MakeCallback (CacheEntryRemoved));

Prototype for the callback is: void (*)(Ptr<const ndn::cs::Entry> entry, Time lifetime)
diff --git a/utils/trie/trie.h b/utils/trie/trie.h
index bcffdc3..a38ac28 100644
--- a/utils/trie/trie.h
+++ b/utils/trie/trie.h
@@ -39,7 +39,7 @@
 /////////////////////////////////////////////////////
 // Allow customization for payload
 //
-template<typename Payload>
+template<typename Payload, typename BasePayload = Payload>
 struct pointer_payload_traits
 {
   typedef Payload         payload_type; // general type of the payload
@@ -49,14 +49,17 @@
   typedef Payload*        return_type;  // what is returned on access
   typedef const Payload*  const_return_type; // what is returned on const access
 
+  typedef typename Payload::base_type*       base_type;       // base type of the entry (when implementation details need to be hidden)
+  typedef const typename Payload::base_type* const_base_type; // const base type of the entry (when implementation details need to be hidden)
+  
   static Payload* empty_payload;
 };
 
-template<typename Payload>
+template<typename Payload, typename BasePayload>
 Payload*
-pointer_payload_traits<Payload>::empty_payload = 0;
+pointer_payload_traits<Payload, BasePayload>::empty_payload = 0;
 
-template<typename Payload>
+template<typename Payload, typename BasePayload = Payload>
 struct smart_pointer_payload_traits
 {
   typedef Payload                 payload_type;
@@ -65,15 +68,18 @@
   
   typedef ns3::Ptr<Payload>       return_type;
   typedef ns3::Ptr<const Payload> const_return_type;
+
+  typedef ns3::Ptr<BasePayload> base_type;
+  typedef ns3::Ptr<const BasePayload> const_base_type;
   
   static ns3::Ptr<Payload> empty_payload;
 };
 
-template<typename Payload>
+template<typename Payload, typename BasePayload>
 ns3::Ptr<Payload>
-smart_pointer_payload_traits<Payload>::empty_payload = 0;
+smart_pointer_payload_traits<Payload, BasePayload>::empty_payload = 0;
 
-template<typename Payload>
+template<typename Payload, typename BasePayload = Payload>
 struct non_pointer_traits
 {
   typedef Payload         payload_type;
@@ -83,12 +89,15 @@
   typedef Payload&        return_type;
   typedef const Payload & const_return_type;
   
+  typedef typename Payload::base_type&       base_type;
+  typedef const typename Payload::base_type& const_base_type;
+  
   static Payload empty_payload;
 };
 
-template<typename Payload>
+template<typename Payload, typename BasePayload>
 Payload 
-non_pointer_traits<Payload>::empty_payload = Payload ();
+non_pointer_traits<Payload, BasePayload>::empty_payload = Payload ();
 
 
 ////////////////////////////////////////////////////