iffparser.h

来自「最新osg包」· C头文件 代码 · 共 116 行

H
116
字号
/*******************************************************      Lightwave Object Loader for OSG  Copyright (C) 2004 Marco Jez <marco.jez@poste.it>  OpenSceneGraph is (C) 2004 Robert Osfield********************************************************/#ifndef IFFPARSER_#define IFFPARSER_#include <vector>#include <iostream>namespace iff{	typedef std::vector<struct Chunk *> Chunk_list;	struct Chunk {		virtual ~Chunk()		{ 			Chunk_list *fod = free_on_destroy();			if (fod) {				for (Chunk_list::iterator i=fod->begin(); i!=fod->end(); ++i) {					delete *i;				}			}		}		virtual Chunk_list *free_on_destroy() { return 0; }	};		template<typename Iter>	class GenericParser {	public:		GenericParser();		GenericParser(std::ostream &os);		virtual ~GenericParser();		void clear();		void parse(Iter begin, Iter end);		inline const Chunk_list &chunks() const;	protected:		virtual Chunk *parse_chunk_data(const std::string &tag, const std::string &context, Iter it, Iter end) = 0;		Chunk *parse_chunk(Iter &it, const std::string &context);		inline std::ostream &os() { return os_; }	private:				Chunk_list chunks_;		std::ostream &os_;	};	/////////////////////////////////////////////////////////////////////////	// IMPLEMENTATION OF TEMPLATE FUNCTIONS#	define IP_TMP	template<class Iter>	IP_TMP GenericParser<Iter>::GenericParser()		: os_(std::cout)	{	}	IP_TMP GenericParser<Iter>::GenericParser(std::ostream &os)		: os_(os)	{	}	IP_TMP GenericParser<Iter>::~GenericParser()	{	}	IP_TMP void GenericParser<Iter>::clear()	{		chunks_.clear();	}	IP_TMP void GenericParser<Iter>::parse(Iter begin, Iter end)	{		Iter it = begin;		while (it < end) {			Chunk *chk = parse_chunk(it, "");			if (chk) chunks_.push_back(chk);		}	}	IP_TMP Chunk *GenericParser<Iter>::parse_chunk(Iter &it, const std::string &context)	{		std::string tag;		for (int i=0; i<4; ++i) tag += *(it++);		unsigned int len = ((static_cast<unsigned int>(*(it)) & 0xFF) << 24) |			((static_cast<unsigned int>(*(it+1)) & 0xFF) << 16) |			((static_cast<unsigned int>(*(it+2)) & 0xFF) << 8) |			(static_cast<unsigned int>(*(it+3)) & 0xFF);                it += 4;		os_ << "DEBUG INFO: iffparser: reading chunk " << tag << ", length = " << len << ", context = " << context << "\n";		Chunk *chk = parse_chunk_data(tag, context, it, it+len);		if (!chk) os_ << "DEBUG INFO: iffparser: \tprevious chunk not handled\n";		it += len;		if ((len % 2) != 0) ++it;		return chk;	}	IP_TMP const Chunk_list &GenericParser<Iter>::chunks() const	{		return chunks_;	}}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?