sim: fixed misc things
[calu.git] / 3b_sim / cmem.cpp
diff --git a/3b_sim/cmem.cpp b/3b_sim/cmem.cpp
new file mode 100644 (file)
index 0000000..90886a2
--- /dev/null
@@ -0,0 +1,35 @@
+#include "cmem.hpp"
+
+using namespace std;
+
+template <class T>
+void CMem<T>::set(const MEMORY_ADDRESS address, const T& data)
+{
+       if(address >= MAX_MEMORY) {
+               stringstream error;
+               error << "memoryaddress " << address << " out of range";
+               throw out_of_range(error.str());
+       }
+
+       MEMORY_ADDRESS temp = address;
+       auto iter = m_memory.begin();
+       while(temp > 0) {
+               ++iter;
+               temp--;
+       }
+
+       iter = m_memory.insert(iter, data);
+       ++iter;
+       m_memory.erase(iter);
+}
+
+template <class T>
+void CMem<T>::get(const MEMORY_ADDRESS address, T& value) const
+{
+       if(address >= MAX_MEMORY) {
+               stringstream error;
+               error << "memoryaddress " << address << " out of range";
+               throw out_of_range(error.str());
+       }
+       value = m_memory[address];
+}