1 /*
2  * Part of tivars_lib_cpp
3  * (C) 2015-2019 Adrien "Adriweb" Bertrand
4  * https://github.com/adriweb/TIs_lib
5  * License: MIT
6  */
7 
8 #include "TIModel.h"
9 #include "TIModels.h"
10 
11 namespace tivars
12 {
13 
supportsType(const TIVarType & type)14     bool TIModel::supportsType(const TIVarType& type)
15     {
16         const std::vector<std::string>& exts = type.getExts();
17         return this->orderID >= 0 && this->orderID < (int)exts.size() && !exts[this->orderID].empty();
18     }
19 
20     /*** "Constructors" ***/
21 
22     /**
23      * @param   int     flags  The version compatibliity flags
24      * @return  TIModel
25      * @throws  \Exception
26      */
createFromFlags(uint flags)27     TIModel TIModel::createFromFlags(uint flags)
28     {
29         if (TIModels::isValidFlags(flags))
30         {
31             TIModel model;
32             model.flags = flags;
33             model.orderID = TIModels::getDefaultOrderIDFromFlags(flags);
34             model.sig = TIModels::getSignatureFromFlags(flags);
35             model.name = TIModels::getDefaultNameFromFlags(flags);
36             return model;
37         } else
38         {
39             throw std::invalid_argument("Invalid version ID");
40         }
41     }
42 
43     /**
44      * @param   string  name   The version name
45      * @return  TIModel
46      * @throws  \Exception
47      */
createFromName(const std::string & name)48     TIModel TIModel::createFromName(const std::string& name)
49     {
50         if (TIModels::isValidName(name))
51         {
52             TIModel model;
53             model.name = name;
54             model.orderID = TIModels::getOrderIDFromName(name);
55             model.flags = TIModels::getFlagsFromName(name);
56             model.sig = TIModels::getSignatureFromName(name);
57             return model;
58         } else
59         {
60             throw std::invalid_argument("Invalid version name");
61         }
62     }
63 
64     /**
65      * @param   string  sig    The signature (magic bytes)
66      * @return  TIModel
67      * @throws  \Exception
68      */
createFromSignature(const std::string & sig)69     TIModel TIModel::createFromSignature(const std::string& sig)
70     {
71         if (TIModels::isValidSignature(sig))
72         {
73             TIModel model;
74             model.sig = sig;
75             model.orderID = TIModels::getDefaultOrderIDFromSignature(sig);
76             model.flags = TIModels::getMinFlagsFromSignature(sig);
77             model.name = TIModels::getDefaultNameFromSignature(sig);
78             return model;
79         } else
80         {
81             throw std::invalid_argument("Invalid version signature");
82         }
83     }
84 }
85 
86 #ifdef __EMSCRIPTEN__
87     #include <emscripten/bind.h>
88     using namespace emscripten;
EMSCRIPTEN_BINDINGS(_timodel)89     EMSCRIPTEN_BINDINGS(_timodel) {
90             class_<tivars::TIModel>("TIModel")
91                     .constructor<>()
92                     .constructor<int, const std::string&, uint, const std::string&>()
93 
94                     .function("getOrderId"  , &tivars::TIModel::getOrderId)
95                     .function("getName"     , &tivars::TIModel::getName)
96                     .function("getFlags"    , &tivars::TIModel::getFlags)
97                     .function("getSig"      , &tivars::TIModel::getSig)
98                     .function("supportsType", &tivars::TIModel::supportsType)
99 
100                     .class_function("createFromFlags",      &tivars::TIModel::createFromFlags)
101                     .class_function("createFromName",       &tivars::TIModel::createFromName)
102                     .class_function("createFromSignature",  &tivars::TIModel::createFromSignature)
103             ;
104     }
105 #endif
106