#ifndef STRING_TABLE_H #define STRING_TABLE_H #include enum ST_TokenType { STTT_STRING, STTT_PARAM, STTT_ENDL, }; class IStringTableToken : public irr::IReferenceCounted { public: virtual ST_TokenType GetType() = 0; }; class TokenString : public IStringTableToken { public: virtual ST_TokenType GetType() { return STTT_STRING; } irr::core::stringw mString; }; class TokenParam : public IStringTableToken { public: virtual ST_TokenType GetType() { return STTT_PARAM; } unsigned int mParamId; }; class TokenEndl : public IStringTableToken { public: virtual ST_TokenType GetType() { return STTT_ENDL; } }; struct StringTableEntry { StringTableEntry() {} StringTableEntry(const irr::core::stringw &identifier_); StringTableEntry(const irr::core::stringw &identifier_, const irr::core::stringw &string_); StringTableEntry(const StringTableEntry &orig_); ~StringTableEntry(); StringTableEntry& operator=(const StringTableEntry &orig_); void Tokenize(const irr::core::stringw &string_); irr::core::stringw GetString( const irr::core::array & params_ ); irr::core::stringw GetIdentifier() const { return mIdentifier; } bool operator <(const StringTableEntry& other_) const { return mIdentifier < other_.mIdentifier; } private: void DropTokens(); irr::core::stringw mIdentifier; irr::core::stringw mOrigString; // we could get along without it, but it makes debugging easier irr::core::array mTokens; }; class StringTable : public irr::IReferenceCounted { public: bool Load(const char* filename_); // bool Save(const c8* filename_); // not implemented //! Get the string for identifier_ //! If identifier_ ain't available return the identifier itself. irr::core::stringw Get(const irr::core::stringw &identifier_, bool clearParamsAfterwards_=true); irr::core::stringw Get(const char *identifier_, bool clearParamsAfterwards_=true); //! strings can have variable parameters. Like "hello %1 %2". //! In this case %1 and %2 will be replaced by the params pushed here. //! The first paramter pushed is %1 as %0 will return the identifier itself. //! To avoid using params when a % is in the string use a backslash like "\%" void PushParam(const irr::core::stringw ¶m_); //! clear manually the parameter stack. Usually you will do that automatically on Get void ClearParams(); //! set the string for the given identifier to value string_ void Set(const irr::core::stringw &identifier_, const irr::core::stringw &string_); //! remove the string for the given identifier_ void Remove(const irr::core::stringw &identifier_); //! add the string for given identifier_ to the stringtable, but without checking if identifier_ exists already //! this can cause duplicates, but is also a lot faster than set void Add(const irr::core::stringw &identifier_, const irr::core::stringw &string_); //! remove duplicated identifiers. One entry for the identifier will be kept, but you have no control which one. //! Returns the number of removed duplicates int RemoveDuplicates(); // selftest bool UnitTest(); private: irr::core::array mStringTable; irr::core::array mParamStack; }; #endif // STRING_TABLE_H