lua++
|
00001 #include "luapp_state.hpp" 00002 #include "luapp_function.hpp" 00003 #include <utils_string.hpp> 00004 00005 namespace lua 00006 { 00007 argument::argument(const std::string& sName, type mLuaType, function* pParent) 00008 { 00009 lData_.push_back(data(sName, mLuaType, this)); 00010 pData_ = &lData_[0]; 00011 pParent_ = pParent; 00012 pLua_ = pParent_->get_state(); 00013 } 00014 00015 void argument::add( const std::string& sName, type mLuaType ) 00016 { 00017 lData_.push_back(data(sName, mLuaType, this)); 00018 if (lData_.size() == 1) 00019 pData_ = &lData_[0]; 00020 } 00021 00022 float argument::get_number() const 00023 { 00024 return pData_->get_value().get<float>(); 00025 } 00026 00027 bool argument::get_bool() const 00028 { 00029 return pData_->get_value().get<bool>(); 00030 } 00031 00032 std::string argument::get_string() const 00033 { 00034 return pData_->get_value().get<std::string>(); 00035 } 00036 00037 int argument::get_index() const 00038 { 00039 return pData_->get_value().get<int>(); 00040 } 00041 00042 type argument::get_type() const 00043 { 00044 return pData_->get_type(); 00045 } 00046 00047 bool argument::is_provided() const 00048 { 00049 return bSet_; 00050 } 00051 00052 bool argument::test(state* pLua, int iIndex, bool bPrintError) 00053 { 00054 bool bSeveralChoices = (lData_.size() > 1); 00055 00056 type mType = pLua->get_type(iIndex); 00057 std::vector<data>::iterator iterdata; 00058 foreach (iterdata, lData_) 00059 { 00060 if (mType != iterdata->get_type()) 00061 { 00062 if (bPrintError && !bSeveralChoices) 00063 { 00064 pLua->print_error( 00065 "argument "+utils::to_string(iIndex)+" of \""+pParent_->get_name()+"\" " 00066 "must be a "+pLua->get_type_name(iterdata->get_type())+" " 00067 "("+iterdata->get_name()+") (got a "+pLua->get_type_name(mType)+")." 00068 ); 00069 } 00070 } 00071 else 00072 { 00073 iterdata->set(pLua, iIndex); 00074 break; 00075 } 00076 } 00077 00078 if (!bSet_) 00079 { 00080 if (bPrintError && bSeveralChoices) 00081 { 00082 std::string sEnum = ""; 00083 uint i = 0; 00084 foreach (iterdata, lData_) 00085 { 00086 if (i == 0) 00087 sEnum += "a "; 00088 else 00089 { 00090 if (i == lData_.size()-1) 00091 sEnum += ", or a "; 00092 else 00093 sEnum += ", a "; 00094 } 00095 00096 sEnum += pLua->get_type_name(iterdata->get_type())+" ("+iterdata->get_name()+")"; 00097 ++i; 00098 } 00099 pLua->print_error( 00100 "argument "+utils::to_string(iIndex)+" of \""+pParent_->get_name()+"\" " 00101 "must be "+sEnum+" (got a "+pLua->get_type_name(mType)+")." 00102 ); 00103 } 00104 } 00105 00106 return bSet_; 00107 } 00108 00109 void argument::set_data(data* pData) 00110 { 00111 bSet_ = true; 00112 pData_ = pData; 00113 } 00114 00115 data* argument::get_data() const 00116 { 00117 return pData_; 00118 } 00119 }