00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 #include "C_IdGenerator.hpp"
00021 #include "Utils.hpp"
00022 
00023 #include "GeneratorTrace.hpp"
00024 
00025 #include "list_t.hpp"
00026 #include "set_t.hpp"
00027 
00028 typedef list_t<int> T_IdList ;
00029 typedef set_t<int>  T_IdSet  ;
00030 
00031 typedef struct _struct_id_gen {
00032   int      m_nb_id_used ;
00033   T_IdList *m_available_ids ;
00034   T_IdSet  *m_used_ids ;
00035 } T_IdGen, *T_pIdGen ;
00036 
00037 
00038 C_IdGenerator::C_IdGenerator() {
00039   T_pIdGen L_gen ;
00040   ALLOC_VAR(L_gen, T_pIdGen, sizeof(T_IdGen));
00041   m_impl = L_gen ;
00042   NEW_VAR(L_gen->m_available_ids, T_IdList());
00043   NEW_VAR(L_gen->m_used_ids, T_IdSet());
00044   L_gen->m_used_ids->clear();
00045   L_gen->m_available_ids->clear();
00046   L_gen->m_nb_id_used = 0 ;
00047 }
00048 
00049 C_IdGenerator::~C_IdGenerator() {
00050   T_pIdGen L_gen = (T_pIdGen) m_impl;
00051   
00052   if (!L_gen->m_used_ids->empty()) {
00053     L_gen->m_used_ids->erase(L_gen->m_used_ids->begin(),
00054                             L_gen->m_used_ids->end());
00055   }
00056   if (!L_gen->m_available_ids->empty()) {
00057     L_gen->m_available_ids->erase(L_gen->m_available_ids->begin(),
00058                                  L_gen->m_available_ids->end());
00059   }
00060   L_gen->m_nb_id_used = 0;
00061 
00062   DELETE_VAR(L_gen->m_available_ids);
00063   DELETE_VAR(L_gen->m_used_ids);
00064 
00065   FREE_VAR(L_gen);
00066   m_impl = NULL ;
00067 }
00068 
00069 int  C_IdGenerator::new_id () {
00070 
00071   T_pIdGen           L_gen = (T_pIdGen) m_impl;
00072   T_IdList::iterator L_it ;
00073   int                L_id ;
00074 
00075   if (!L_gen->m_available_ids->empty()) {
00076     L_it = L_gen->m_available_ids->begin() ;
00077     L_id = *L_it ;
00078     L_gen->m_available_ids->erase(L_it);
00079   } else {
00080     L_id = L_gen->m_nb_id_used ;
00081     (L_gen->m_nb_id_used)++ ;
00082   }
00083   L_gen->m_used_ids->insert(L_id);
00084 
00085   return (L_id);
00086 } 
00087 
00088 int  C_IdGenerator::release_id (int P_id) {
00089 
00090   T_pIdGen          L_gen = (T_pIdGen) m_impl;
00091   int               L_ret = -1 ;
00092   T_IdSet::iterator L_it ;
00093 
00094   L_it = L_gen->m_used_ids->find(P_id) ;
00095   if (L_it != L_gen->m_used_ids->end()) {
00096     L_gen->m_used_ids->erase(L_it);
00097     L_gen->m_available_ids->push_back(P_id);
00098     L_ret = 0 ;
00099   }
00100   return (L_ret);
00101 }