ContentStore with hash table library were added

diff --git a/model/ndn_contentstore.cc b/model/ndn_contentstore.cc
new file mode 100644
index 0000000..61d6452
--- /dev/null
+++ b/model/ndn_contentstore.cc
@@ -0,0 +1,123 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * 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: Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+#include "ndn_contentstore.h"
+
+namespace ns3
+{
+namespace NDNabstraction
+{
+    
+ContentStore::ContentStore( int maxSize )
+: m_maxSize(maxSize) { }
+
+
+ContentStore::~ContentStore( ) 
+{ }
+
+//Find corresponding CS entry for the given content name
+CsEntry* 
+ContentStore::Lookup(const char *prefix )
+{
+	CriticalSection section(m_csMutex);
+    
+    struct CsEntry *result = NULL;
+    
+    HASH_FIND_STR (m_contentStore, prefix, result);
+    
+    if(result != NULL)
+        Promote (*result);
+    
+	return result;
+}
+
+
+
+//Add entry to content store, if content store is full, use LRU replacement
+void 
+ContentStore::Add( const char *contentName, int contentSize )
+{
+    CriticalSection section(m_csMutex);
+    
+    // removing the old record
+    struct CsEntry *tmp = NULL;
+    HASH_FIND_STR (m_contentStore, contentName, tmp);
+    HASH_DELETE (hh, m_contentStore,tmp);
+    //free(tmp);
+    
+    int size = (int)HASH_COUNT(m_contentStore);
+    
+	if(size == m_maxSize )
+	{
+		CsEntry *entry = m_LRU.back();
+        HASH_DELETE (hh, m_contentStore,entry);//_cs.erase( entry->contentName );
+		m_LRU.pop_back( );
+	}
+    
+	struct CsEntry *ce = (struct CsEntry*)malloc(sizeof(struct CsEntry));
+	ce->contentName = (char*)contentName;
+	ce->contentSize = contentSize;
+    
+	//_cs[ contentName ] = ce;
+    HASH_ADD_KEYPTR (hh, m_contentStore, ce->contentName, strlen(ce->contentName), ce);
+    
+	//CsEntry *ce_in_hash = &(_cs[ contentName ]);
+    struct CsEntry *ce_in_hash = NULL;
+    HASH_FIND_STR (m_contentStore, contentName, ce_in_hash);
+	m_LRU.push_front( ce_in_hash );
+	ce_in_hash->lruPosition = m_LRU.begin( );
+}
+
+
+//move the given CS entry to the head of the list
+void 
+ContentStore::Promote(CsEntry &ce )
+{
+	// should not lock mutex. Otherwise deadlocks will be welcome
+	if( m_LRU.front() == &ce ) return;
+    
+	//assert( *(ce.lruPosition)==&ce ); // should point to the same object
+    
+	// swaping positions in _lru
+	m_LRU.erase( ce.lruPosition );
+	m_LRU.push_front( &ce );
+	ce.lruPosition = m_LRU.begin( );
+    
+	//assert( *(ce.lruPosition)==&ce ); // should point to the same object
+}
+
+void 
+ContentStore::Dump()
+{
+	CriticalSection section(m_csMutex);
+    
+    struct CsEntry *s, *tmp;
+    
+    HASH_ITER(hh, m_contentStore, s, tmp) 
+    {
+        printf("-%s-", s->contentName);
+        /* ... it is safe to delete and free s here */
+    }
+    
+    printf("\n");
+    
+}
+}
+}