Index: /trunk/Mars/mbase/MFits.h
===================================================================
--- /trunk/Mars/mbase/MFits.h	(revision 11486)
+++ /trunk/Mars/mbase/MFits.h	(revision 11487)
@@ -294,5 +294,8 @@
     Table fTable;
 
-    map<void*, Table::Column> fAddresses;
+    typedef pair<void*, Table::Column> Address;
+    typedef vector<Address> Addresses;
+    //map<void*, Table::Column> fAddresses;
+    Addresses fAddresses;
 
     vector<char> fBufferRow;
@@ -419,4 +422,12 @@
     }
 
+    template<size_t N>
+        void revcpy(char *dest, const char *src, int num)
+    {
+        const char *end = src + num*N;
+        for (const char *ptr = src; ptr<end; ptr+=N, dest+=N)
+            reverse_copy(ptr, ptr+N, dest);
+    }
+
     bool GetRow(size_t row)
     {
@@ -425,15 +436,20 @@
             return good();
 
-        for (map<void*,Table::Column>::const_iterator it=fAddresses.begin();
-             it!=fAddresses.end(); it++)
+        for (Addresses::const_iterator it=fAddresses.begin(); it!=fAddresses.end(); it++)
         {
             const Table::Column &c = it->second;
 
             const char *src = fBufferRow.data() + c.offset;
-            const char *end = src + c.num*c.size;
-
             char *dest = reinterpret_cast<char*>(it->first);
-            for (const char *ptr = src; ptr<end; ptr+=c.size, dest+=c.size)
-                reverse_copy(ptr, ptr+c.size, dest);
+
+            // Let the compiler do some optimization by
+            // knowing the we only have 1, 2, 4 and 8
+            switch (c.size)
+            {
+            case 1: memcpy   (dest, src, c.num*c.size); break;
+            case 2: revcpy<2>(dest, src, c.num);        break;
+            case 4: revcpy<4>(dest, src, c.num);        break;
+            case 8: revcpy<8>(dest, src, c.num);        break;
+            }
         }
 
@@ -452,4 +468,9 @@
     }
 
+    static bool Compare(const Address &p1, const Address &p2)
+    {
+        return p1.first>p2.first;
+    }
+
     template<typename T>
     bool SetPtrAddress(const string &name, T *ptr, size_t cnt)
@@ -480,6 +501,7 @@
         //     gLog << warn << "SetPtrAddress('" << name << "') - Pointer " << ptr << " already assigned." << endl;
 
-        fAddresses[ptr] = fTable.cols[name];
-
+        //fAddresses[ptr] = fTable.cols[name];
+        fAddresses.push_back(make_pair(ptr, fTable.cols[name]));
+        sort(fAddresses.begin(), fAddresses.end(), Compare);
         return true;
     }
@@ -514,9 +536,11 @@
         //     gLog << warn << "SetPtrAddress('" << name << "') - Pointer " << ptr << " already assigned." << endl;
 
-        fAddresses[ptr] = fTable.cols[name];
-
+        //fAddresses[ptr] = fTable.cols[name];
+        fAddresses.push_back(make_pair(ptr, fTable.cols[name]));
+        sort(fAddresses.begin(), fAddresses.end(), Compare);
         return true;
     }
 
+    bool     HasKey(const string &key) const { return fTable.HasKey(key); }
     int64_t  GetInt(const string &key) const { return fTable.Get<int64_t>(key); }
     uint64_t GetUInt(const string &key) const { return fTable.Get<uint64_t>(key); }
