Index: /trunk/Mars/mcore/fits.h
===================================================================
--- /trunk/Mars/mcore/fits.h	(revision 12736)
+++ /trunk/Mars/mcore/fits.h	(revision 12737)
@@ -15,4 +15,6 @@
 #ifdef __CINT__
 #define off_t size_t
+#else
+#include <unordered_map>
 #endif
 
@@ -399,4 +401,13 @@
     Addresses fAddresses;
 
+#ifdef __CINT__
+    typedef map<string, void*> Pointers;
+#else
+    typedef unordered_map<string, void*> Pointers;
+#endif
+    Pointers fPointers;
+
+    vector<vector<char>> fGarbage;
+
     vector<char> fBufferRow;
     vector<char> fBufferDat;
@@ -614,4 +625,34 @@
     }
 
+    template<class T, class S>
+    const T &GetAs(const string &name)
+    {
+        return *reinterpret_cast<S*>(fPointers[name]);
+    }
+
+    void *SetPtrAddress(const string &name)
+    {
+        if (fTable.cols.count(name)==0)
+        {
+            ostringstream str;
+            str <<"SetPtrAddress('" << name << "') - Column not found." << endl;
+#ifdef __EXCEPTIONS
+            throw runtime_error(str.str());
+#else
+            gLog << ___err___ << "ERROR - " << str.str() << endl;
+            return NULL;
+#endif
+        }
+
+        fGarbage.push_back(vector<char>(fTable.cols[name].size*fTable.cols[name].num));
+
+        void *ptr = fGarbage.back().data();
+
+        fPointers[name] = ptr;
+        fAddresses.push_back(make_pair(ptr, fTable.cols[name]));
+        sort(fAddresses.begin(), fAddresses.end(), Compare);
+        return ptr;
+    }
+
     template<typename T>
     bool SetPtrAddress(const string &name, T *ptr, size_t cnt)
@@ -659,4 +700,5 @@
 
         //fAddresses[ptr] = fTable.cols[name];
+        fPointers[name] = ptr;
         fAddresses.push_back(make_pair(ptr, fTable.cols[name]));
         sort(fAddresses.begin(), fAddresses.end(), Compare);
@@ -706,4 +748,5 @@
 
         //fAddresses[ptr] = fTable.cols[name];
+        fPointers[name] = ptr;
         fAddresses.push_back(make_pair(ptr, fTable.cols[name]));
         sort(fAddresses.begin(), fAddresses.end(), Compare);
@@ -713,6 +756,6 @@
     bool     HasKey(const string &key) const { return fTable.HasKey(key); }
     bool     HasColumn(const string& col) const { return fTable.HasColumn(col);}
-    const Table::Columns &GetColumns() const { return fTable.getColumns();}
-    const Table::Keys &GetKeys() const { return fTable.getKeys();}
+    const Table::Columns &GetColumns() const { return fTable.GetColumns();}
+    const Table::Keys &GetKeys() const { return fTable.GetKeys();}
 
     int64_t  GetInt(const string &key) const { return fTable.Get<int64_t>(key); }
