123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- #ifndef __CC_BUNDLE_READER_H__
- #define __CC_BUNDLE_READER_H__
- #include <string>
- #include <vector>
- #include "base/CCRef.h"
- #include "platform/CCPlatformMacros.h"
- #include "base/CCConsole.h"
- NS_CC_BEGIN
- class BundleReader: public cocos2d::Ref
- {
- public:
-
- BundleReader();
-
-
- ~BundleReader();
-
-
- void init(char* buffer, ssize_t length);
-
- ssize_t read(void* ptr, ssize_t size, ssize_t count);
-
- char* readLine(int num, char* line);
-
- bool eof();
-
- ssize_t length();
-
- ssize_t tell();
-
- bool seek(long int offset, int origin);
-
- bool rewind();
-
- template<typename T> bool read(T* ptr);
- template<typename T> bool readArray(unsigned int* length, std::vector<T>* values);
-
- std::string readString();
-
- bool readMatrix(float* m);
- private:
- ssize_t _position;
- ssize_t _length;
- char* _buffer;
- };
- template<typename T>
- inline bool BundleReader::read(T *ptr)
- {
- return (read(ptr, sizeof(T), 1) == 1);
- }
- template<typename T>
- inline bool BundleReader::readArray(unsigned int *length, std::vector<T> *values)
- {
- if (!read(length))
- {
- return false;
- }
-
- if (*length > 0 && values)
- {
- values->resize(*length);
- if (read(&(*values)[0], sizeof(T), *length) != *length)
- {
- return false;
- }
- }
- return true;
- }
- template<>
- inline bool BundleReader::read<char>(char *ptr)
- {
- if (read(ptr, sizeof(char), 1) == 1)
- {
- return true;
- }
- else
- {
- *ptr = -1;
- return false;
- }
- }
- template<>
- inline bool BundleReader::read<std::string>(std::string* )
- {
- CCLOG("can not read std::string, use readString() instead");
- return false;
- }
- template<>
- inline bool BundleReader::readArray<std::string>(unsigned int *length, std::vector<std::string> *values)
- {
- if (!read(length))
- {
- return false;
- }
- values->clear();
- if (*length > 0 && values)
- {
- for (int i = 0; i < (int)*length; ++i)
- {
- values->push_back(readString());
- }
- }
- return true;
- }
- NS_CC_END
- #endif
|