lua++
C:/Documents and Settings/Kalith/My Documents/Programmation/luapp/src/luapp_argument.cpp
Go to the documentation of this file.
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 }