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. 如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面 ... 
随机推荐
- slf4j日志框架
- sqlserver for xml
			FOR XML子句有四种最基本的模式 1.AUTO模式:返回数据表为起表名的元素,每一列的值返回为属性:2.RAW模式:返回数据行为元素,每一列的值作为元素的属性: 3.PATH模式:通过简单的XPa ... 
- string.Empty与null与""
			(1)NULLnull 关键字是表示不引用任何对象的空引用的文字值.null 是引用类型变量的默认值.那么也只有引用型的变量可以为NULL,如果int i=null,的话,是不可以的,因为Int是值类 ... 
- 对图片进行X,Y轴的翻转,黑白色转变
			做完了修改图片的程序.用的Winfrom做的.昨天基本完成,记录一下使用的东西. 首先是将需要加载的图片放入picturebox控件,这里用到了openfiledialog 打开文件对话框 strin ... 
- Crack IDEA
			使用破解补丁 Crack IDEA→在http://idea.lanyus.com/上可以找到最新的破解补丁,下载并放到软件的bin目录下 →更改bin目录下的两个文件:Idea.exe.vmopti ... 
- 十大基于Docker的开发工具
			http://www.infoq.com/cn/news/2014/08/top-10-open-source-docker FlynnFlynn是一个使用Go语言编写的开源PaaS平台,Flynn使 ... 
- Ajax与Controller的参数交互
			理论 jQuery.ajax( options )中重要参数设置 jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据.通过jquery.ajax与SpringMVC的C ... 
- [Token] 从index.jsp中获取Token
			import com.eviware.soapui.support.GroovyUtils def groovyUtils = new GroovyUtils( context ) def holde ... 
- zigbee初探
			什么是zigbee? 1.它是一种通信方式,一种通信协议: 2.其作用就是构建一个类似无线局域网的东西:如果这个局域网用于传感器的数据收集.监控,那么这个网络就叫做无线传感器网络. 应用领域:家居.工 ... 
- Linux Mint 17 搭建 JSP 环境
			一.配置Tomcat 服务器 1.下载 tomcat 2.解压后放到/usr/local目录下面 3.以root权限执行 chmod +x *.sh 4.启动 ./startup.sh#方式1 ./ ... 
