00001
00014 namespace qlib {
00015
00016 namespace ace {
00017
00018 template<
00019 typename Seq,
00020 typename Result
00021 >
00022 int Callback_Manager<Seq, Result>::add(param_type seq_id, callback_pointer callback, int option) {
00023 typename container_type::iterator it = callbacks_.find(seq_id);
00024 if(it != callbacks_.end())
00025 if( option == ADD_REPLACE )
00026 delete it->second;
00027 else if( option == ADD_WARNING )
00028 return 1;
00029 else
00030 return -1;
00031
00032 callbacks_[seq_id] = callback;
00033
00034 return 0;
00035 }
00036
00037 template<
00038 typename Seq,
00039 typename Result
00040 >
00041 int Callback_Manager<Seq, Result>::callback(param_type seq_id) {
00042 callback_pointer cb = find(seq_id);
00043 if(cb == NULL)
00044 return -1;
00045
00046 return dispose(seq_id, cb->exec());
00047 }
00048
00049 template<
00050 typename Seq,
00051 typename Result
00052 >
00053 int Callback_Manager<Seq, Result>::callback(param_type seq_id, typename callback_type::result_type * result ) {
00054 callback_pointer cb = find(seq_id);
00055 if(cb == NULL)
00056 return -1;
00057
00058 return dispose(seq_id, cb->exec(result));
00059 }
00060
00061
00062 template<
00063 typename Seq,
00064 typename Result
00065 >
00066 int Callback_Manager<Seq, Result>::dispose(param_type seq_id, int ret_value){
00067 callback_pointer cb = find(seq_id);
00068 if(!cb)
00069 return -1;
00070
00071 if( ret_value > 0 )
00072 delete cb;
00073 if( ret_value >= 0 )
00074 return callbacks_.erase(seq_id);
00075
00076 return 0;
00077 }
00078
00079 template<
00080 typename Seq,
00081 typename Result
00082 >
00083 int Callback_Manager<Seq, Result>::cancel(param_type seq_id) {
00084 callback_pointer cb = find(seq_id);
00085 if(cb == 0)
00086 return -1;
00087
00088 int ret = cb->cancel();
00089 if( ret > 0 )
00090 delete cb;
00091 if( ret >= 0 )
00092 callbacks_.erase(seq_id);
00093
00094 return 0;
00095 }
00096
00097
00098
00099 }
00100
00101 }