boost::string 例題1

來源:互聯網
上載者:User

標籤:boost   c++   string   

假設有一個文法正確的shader源檔案,其包含若干關於uniform變數的定義。請寫一個程式從某個shader源檔案中提取其所有定義的uniform變數,要求記錄其名稱、資料類型和初始值(如果有定義),並且可以設計一個函數可以修改某個uniform變數的值。

如下表所示,程式需要提取出一共6個uniform變數,並存放如某種資料結構中,其中3個有初始值,3個沒有初始值,並且使用者可以修改該資料結構中指定的uniform變數的值。

uniform vec3 uLightDirectionE;

uniform vec3 uMaterialAmbient = vec3(0.3, 0.3, 0.3);

uniform vec3 uMaterialDiffuse = vec3(0.9, 0.7, 0.7);

uniform vec3 uLightAmbient = vec3(0.6, 0.6, 0.6);

uniform vec3 uLightDiffuse;

uniform bool uIsFirstFrame;

 

void main()

{

}

#include <iostream>#include <fstream>#include <map>#include <vector>#include <boost/any.hpp>#include <boost/lexical_cast.hpp>#include <boost/algorithm/string.hpp>#include <boost/utility/string_ref.hpp>template<typename T>struct any_print{void operator()(boost::any &a){try{std::cout << *boost::any_cast<T>(&a);}catch (boost::bad_any_cast& e){std::cout << e.what() << std::endl;}}};//////////////////////////////////////////////////////////////////////////template<typename T>inline void any_print_fun(boost::any& a){any_print<T>()(a);}struct vec3{float x;float y;float z;vec3(float vX = 0.0f, float vY = 0.0f, float vZ = 0.0f) : x(vX), y(vY), z(vZ) {}friend std::ostream& operator<<(std::ostream& os, const vec3& vData){os << "vec3(" << vData.x << "," << vData.y << "," << vData.z << ")";return os;}};class CTest{public:CTest() {}~CTest() {}//*********************************************************************************//FUNCTION:void parseText(const char* vFileName){std::ifstream Ifs(vFileName);if (!Ifs) {std::cout << "Can not open the file " << vFileName << std::endl;exit(-1);}std::string TmpStr;while (getline(Ifs, TmpStr)){//std::cout << TmpStr  << " xxx " << std::endl;if (TmpStr.find("uniform") != std::string::npos){processUniformString(TmpStr);}}Ifs.close();}//*********************************************************************************//FUNCTION:void setValue(const std::string& vValueName, const boost::any& vValue){DataType::iterator It = m_ValueData.find(vValueName);if (It == m_ValueData.end()){std::cout << "can not find the value " << vValueName << std::endl;return;}if (It->second.second.type() != vValue.type()){std::cout << "The type is not the same" << vValueName << std::endl;return;}m_ValueData[vValueName] = std::make_pair(It->second.first, vValue);}//*********************************************************************************//FUNCTION:void printData() {for (DataType::iterator It=m_ValueData.begin(); It != m_ValueData.end(); ++It){std::cout << It->first << " " << It->second.first << " ";if (It->second.first == "bool") any_print_fun<bool>(It->second.second);else if (It->second.first == "int") any_print_fun<int>(It->second.second);else if (It->second.first == "float") any_print_fun<float>(It->second.second);else if (It->second.first == "vec3") any_print_fun<vec3>(It->second.second);std::cout << std::endl;}}private:typedef boost::split_iterator<std::string::const_iterator> Split_String_Itearor;typedef std::map<std::string, std::pair<std::string, boost::any>> DataType;//*********************************************************************************//FUNCTION: 只處理了int,bool, float, vec3這幾種類型void processUniformString(const std::string& vSorceString){Split_String_Itearor Bgn, End;std::vector<std::string> StrVec;for (Bgn = boost::algorithm::make_split_iterator(vSorceString, boost::algorithm::token_finder(boost::is_any_of(" (,);"))); Bgn != End; ++Bgn){ if ((*Bgn).size()>0) StrVec.push_back(std::string((*Bgn).begin(), (*Bgn).end()));}/*for (int i=0; i<StrVec.size(); ++i){std::cout << "[" << StrVec[i] << "]" ;}std::cout << std::endl;*/std::string ValueTeyp = StrVec[1];std::string Key       = StrVec[2];if (ValueTeyp == "bool"){   if (StrVec.size() == 3)m_ValueData[Key] = std::make_pair(ValueTeyp, boost::any(bool(0)));else if (StrVec.size() == 5)m_ValueData[Key] = std::make_pair(ValueTeyp, boost::any(boost::lexical_cast<bool>(StrVec[4])));}else if (ValueTeyp == "int"){if (StrVec.size() == 3)m_ValueData[Key] = std::make_pair(ValueTeyp, boost::any(int(0)));else if (StrVec.size() == 5)m_ValueData[Key] = std::make_pair(ValueTeyp, boost::any(boost::lexical_cast<int>(StrVec[4])));}else if (ValueTeyp == "float"){if (StrVec.size() == 3)m_ValueData[Key] = std::make_pair(ValueTeyp, boost::any(float(0)));else if (StrVec.size() == 5)m_ValueData[Key] = std::make_pair(ValueTeyp, boost::any(boost::lexical_cast<float>(StrVec[4])));}else if (ValueTeyp == "vec3") {if (StrVec.size() == 3)m_ValueData[Key] = std::make_pair(ValueTeyp, boost::any(vec3(0, 0, 0)));else if (StrVec.size() == 8){float x = boost::lexical_cast<float>(StrVec[5]);float y = boost::lexical_cast<float>(StrVec[6]);float z = boost::lexical_cast<float>(StrVec[7]);m_ValueData[Key] = std::make_pair(ValueTeyp, boost::any(vec3(x, y, z)));}}else {std::cout << "can not process the type :" << ValueTeyp << " the value may be wrong " << std::endl;}}private:DataType m_ValueData;};int main(){CTest Test;Test.parseText("test.txt");Test.printData();Test.setValue("uLightDiffuse", boost::any(vec3(10.0, 1.0, 1.0)));Test.setValue("uIsFirstFrame", boost::any(bool(1)));Test.printData();getchar();return 0;}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.