boost::string 例题1
如果有一个语法正确的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;
}boost::string 例题1的更多相关文章
- boost::string or boost::regex
有时候写代码时会遇到下面问题 如果有一个文本文件,其包括内容类似于C语言,当中有一行例如以下格式的语句: layout (local_size_x = a,local_size_y = b, loca ...
- boost string algorithm
The Boost.StringAlgorithms library provides many free-standing functions for string manipulation. 1. ...
- (四)boost库之正则表达式regex
(四)boost库之正则表达式regex 正则表达式可以为我们带来极大的方便,有了它,再也不用为此烦恼 头文件: #include <boost/regex.hpp> 1.完全匹配 std ...
- C++ TR1、TR2与boost的关系
C++ Technical Report 1 (TR1)是ISO/IEC TR 19768, C++ Library Extensions(函式库扩充)的一般名称.TR1是一份文件,内容提出了对C++ ...
- boost库:字符串处理
使用boost库的字符串处理之前,需要进行区域设置.类:std::locale,每个C++程序自动拥有一个此类的实例,不能直接访问全局区域设置. 全局区域设置可以使用类std::locale中的静态函 ...
- C/C++ 程序库
C/C++ 程序库 // --------------------------------------------- 来几个不常见但是很变态的库吧: bundle: 把几乎所有常见的压缩库封装成了一个 ...
- [Python] 00 - Books
A.I. & Optimization Advanced Machine Learning, Data Mining, and Online Advertising Services Ref: ...
- C++ 著名程序库 概览
本文转载自: http://ace.acejoy.com/thread-3777-1-1.html 1.C++各大有名库的介绍--C++标准库 2.C++各大有名库的介绍--准标准库B ...
- 高质量C++C编程指南笔记 标签: c++笔记 2015-11-22 20:59 179人阅读 评论(0) 收藏
1. 在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少 CPU 跨切循环层的次数. 2. 如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面 ...
随机推荐
- ABAP内表数据和JSON格式互转
本程序演示ABAP内表数据如何转为JSON格式,以及JSON数据如何放入内表. 注:json字符串格式如:jsonstr = '[ {flag: "0",message: &quo ...
- swarmkit test
swarmd -d /tmp/node-1 --listen-control-api /tmp/node-1/swarm.sock --hostname mhc --engine-addr=tcp:/ ...
- java算法 第七届 蓝桥杯B组(题+答案) 5.抽签
5.抽签 (代码填空) X星球要派出一个5人组成的观察团前往W星.其中:A国最多可以派出4人.B国最多可以派出2人.C国最多可以派出2人..... 那么最终派往W星的观察团会有多少种国别的不同组合呢 ...
- OPEN LDAP
一.安装OPENLDAP 安装完成后退出 编辑两个文本,输入以下内容,并把文本文件改名为ldap01.ldif和ldap02.ldif. ldap01.ldif: dn: dc=maxcrc,dc=c ...
- Ztree右键事件,如何让指定的子节点不显示右键菜单。
这里我记录一下我自己的解决方案: 1.首先在Ztree的setting设置中加一个鼠标右键回调函数onRightClick,然后在加一个beforeRightClick(具体含义可以看官方API) v ...
- JAVA数据结构实现原理
HashTable 线程安全, 内部函数被synchronized修饰,对象级的锁 HashMap 非线程安全, 需要tradeoff 空间和查找时间, 空间利用率低时,冲突少,查询效率高,反之空间利 ...
- Weblogic10.3.6部署解决CXF webService 调用报错: “Cannot create a secure XMLInputFactory”
一,解决步骤 1.添加jar包 stax2-api-3.1.4.jar woodstox-core-asl-4.4.1.jar 2.编写监听器 package com.neusoft.cxf.list ...
- ssh上外网
https://www.cnblogs.com/leipei2352/archive/2011/07/21/2112274.html http://www.qijiannet.com/web/1332 ...
- YII2 自动 created_at created_by updated_by updated_at
use yii\behaviors\TimestampBehavior; use yii\behaviors\BlameableBehavior; use yii\db\Expression; /** ...
- css 字体上下居中显示 解决安卓手机line-height的偏差
1.字体左右居中显示 text-align: center <div class="font"> 上下居中 </div> .font{ width: ...