1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
#include <string>
#include <map>
// classes de base qui nous servira dans le tableau associatif
struct ARINC_decoder_base
{
virtual void masquer_donnee(/*TODO*/)const=0;
virtual void decoder_donnee(/*TODO*/)const=0;
virtual std::string const& variable_name()const=0;
virtual unsigned char ssm()const=0;
virtual unsigned char sdi()const=0;
};
namespace ARINC_details_
{
enum ARINC_labels // Les différents labels de ton équipement :
{
L_1,
L_2,
L_3
//TODO pour tous tes labels ...
};
// les 'politiques' de label : une 'politique' partage les même fonctions de masquage et décodage de données pour plusieurs labels:
enum ARINC_politique_labels_
{
POL_A,
POL_B,
POL_C,
POL_D
//TODO pour toutes tes politiques de labels ...
};
template<ARINC_politique_labels_> struct ARINC_decoder_politique {};
// spécialisation partielle pour chaque politique :
template<> struct ARINC_decoder_politique<POL_A>
{
static void masquer_donnee(/*TODO*/){/*TODO*/}
static void decoder_donnee(/*TODO*/){/*TODO*/}
};
template<> struct ARINC_decoder_politique<POL_B>
{
static void masquer_donnee(/*TODO*/){/*TODO*/}
static void decoder_donnee(/*TODO*/){/*TODO*/}
};
//TODO pour toutes tes politiques de labels ...
// association label&politique :
template<ARINC_labels> struct politique_label{};
template<> struct politique_label<L_1>
{
typedef ARINC_decoder_politique<POL_A> politique;
};
template<> struct politique_label<L_2>
{
typedef ARINC_decoder_politique<POL_A> politique;
};
template<> struct politique_label<L_3>
{
typedef ARINC_decoder_politique<POL_B> politique;
};
//TODO pour toutes tes associations labels/politiques de labels ...
template<ARINC_labels>
struct ARINC_decoder_trait{
static const std::string str_variable_name;
static const unsigned char m_ssm_expected;
static const unsigned char m_sdi_expected;
};
// tu les définis pour chaque label :
// pour ça, je n'hésite pas à me faire des macros :
#define DEFINE_DECODER_TRAIT(label_, var_name_, ssm_,sdi_)\
template<> const std::string ARINC_decoder_trait<label_>::str_variable_name = var_name_;\
template<> const unsigned char ARINC_decoder_trait<label_>::m_ssm_expected=ssm_;\
template<> const unsigned char ARINC_decoder_trait<label_>::m_sdi_expected=sdi_;
DEFINE_DECODER_TRAIT(L_1,"var_1",0x01,0x01)
DEFINE_DECODER_TRAIT(L_2,"var_2",0x01,0x02)
DEFINE_DECODER_TRAIT(L_3,"var_3",0x01,0x02)
//TODO pour tous tes labels
// ne pas laisser de define qui ne servent plus
#undef DEFINE_DECODER_TRAIT
// association des labels et des infos :
template<ARINC_labels label_> struct ARINC_labels_desc : public ARINC_decoder_base
{
virtual void masquer_donnee(/*TODO*/)const
{
politique_label<label_>::politique::masquer_donnee();
}
virtual void decoder_donnee(/*TODO*/)const
{
politique_label<label_>::politique::decoder_donnee();
}
virtual std::string const& variable_name()const
{
return ARINC_decoder_trait<label_>::str_variable_name;
}
virtual unsigned char ssm()const
{
return ARINC_decoder_trait<label_>::m_ssm_expected;
}
virtual unsigned char sdi()const
{
return ARINC_decoder_trait<label_>::m_sdi_expected;
}
};
}
struct ARINC_decoder
{
private:
ARINC_decoder();
ARINC_decoder(ARINC_decoder const&);
ARINC_decoder&operator=(ARINC_decoder const&);
~ARINC_decoder();
typedef std::map<unsigned char,ARINC_decoder_base const *> containter;
typedef containter::const_iterator citerator;
static void build_it(containter&cont_)
{
cont_[0x01]=new ARINC_details_::ARINC_labels_desc<ARINC_details_::L_1>();
cont_[0x02]=new ARINC_details_::ARINC_labels_desc<ARINC_details_::L_2>();
cont_[0x03]=new ARINC_details_::ARINC_labels_desc<ARINC_details_::L_3>();
//TODO pour toutes tes associations octet reçu/label ...
}
public:
static ARINC_decoder_base const* get_it(unsigned char uc_)
{
static containter s_decoders;
if(s_decoders.size()==0){
build_it(s_decoders);
}
citerator it(s_decoders.find(uc_));
if(it==s_decoders.end()){
// throw une erreur : throw std::exception();
// ou
return NULL;
}
return it->second;
}
}; |
Partager