#include <iostream>
#include <utility>
#include <string>
 #include <boost/bimap.hpp>
#include <QMutex>
 using namespace std;

      template <typename T>
 void Serializer<T>::clear(){
     _map.clear();

     }

     template <typename T>
    bool Serializer<T>::setUid(int n, const T* c){
                _lock.lock();
        pair<typename boost::bimap<int,const T*>::iterator,bool> ret;
        ret=_map.insert(typename boost::bimap<int, const T*>::value_type(n,c));
            _lock.unlock();
        return ret.second;
    }


    template <typename T>
        int Serializer<T>::setUid(const T* c){
        static int static_uid=0;
        _lock.lock();
        pair<typename boost::bimap<int,const T*>::iterator,bool> ret;
        ret=_map.insert(typename boost::bimap<int, const T*>::value_type(static_uid,c));

        if(ret.second==false){
            //c already exists
           typename boost::bimap<int, const T*>::right_const_iterator it=_map.right.find(c);
                    int t=-1;
                    if (it!=_map.right.end()) t=(*it).second;
            _lock.unlock();
            return t;
        }
        static_uid++;
        _lock.unlock();
        return static_uid-1;
    }


    template <typename T>
        const T* Serializer<T>::getValue(int n){
        _lock.lock();
                typename boost::bimap<int, const T*>::left_const_iterator it=_map.left.find(n);
        const T* t =NULL;
                if (it!=_map.left.end()) t=(*it).second;
        _lock.unlock();
        return t;
    }


    template <typename T>
        int Serializer<T>::getUid(const T* c){
                _lock.lock();
                typename boost::bimap<int, const T*>::right_const_iterator it=_map.right.find(c);
                int t=-1;
                if (it!=_map.right.end()) t=(*it).second;
        _lock.unlock();
        return t;
    }
