llkeywords.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:5k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llkeywords.h
  3.  * @brief Keyword list for LSL
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_LLKEYWORDS_H
  33. #define LL_LLKEYWORDS_H
  34. #include "llstring.h"
  35. #include "v3color.h"
  36. #include <map>
  37. #include <list>
  38. #include <deque>
  39. #include "llpointer.h"
  40. class LLTextSegment;
  41. typedef LLPointer<LLTextSegment> LLTextSegmentPtr;
  42. class LLKeywordToken
  43. {
  44. public:
  45. enum TOKEN_TYPE { WORD, LINE, TWO_SIDED_DELIMITER, ONE_SIDED_DELIMITER };
  46. LLKeywordToken( TOKEN_TYPE type, const LLColor3& color, const LLWString& token, const LLWString& tool_tip ) 
  47. :
  48. mType( type ),
  49. mToken( token ),
  50. mColor( color ),
  51. mToolTip( tool_tip )
  52. {
  53. }
  54. S32 getLength() const { return mToken.size(); }
  55. BOOL isHead(const llwchar* s) const;
  56. const LLWString& getToken() const { return mToken; }
  57. const LLColor3& getColor() const { return mColor; }
  58. TOKEN_TYPE getType()  const { return mType; }
  59. const LLWString& getToolTip() const { return mToolTip; }
  60. #ifdef _DEBUG
  61. void dump();
  62. #endif
  63. private:
  64. TOKEN_TYPE mType;
  65. LLWString mToken;
  66. LLColor3 mColor;
  67. LLWString mToolTip;
  68. };
  69. class LLKeywords
  70. {
  71. public:
  72. LLKeywords();
  73. ~LLKeywords();
  74. BOOL loadFromFile(const std::string& filename);
  75. BOOL isLoaded() const { return mLoaded; }
  76. void findSegments(std::vector<LLTextSegmentPtr> *seg_list, const LLWString& text, const LLColor4 &defaultColor, class LLTextEditor& editor );
  77. // Add the token as described
  78. void addToken(LLKeywordToken::TOKEN_TYPE type,
  79. const std::string& key,
  80. const LLColor3& color,
  81. const std::string& tool_tip = LLStringUtil::null);
  82. // This class is here as a performance optimization.
  83. // The word token map used to be defined as std::map<LLWString, LLKeywordToken*>.
  84. // This worked, but caused a performance bottleneck due to memory allocation and string copies
  85. //  because it's not possible to search such a map without creating an LLWString.
  86. // Using this class as the map index instead allows us to search using segments of an existing
  87. //  text run without copying them first, which greatly reduces overhead in LLKeywords::findSegments().
  88. class WStringMapIndex
  89. {
  90. public:
  91. // copy constructor
  92. WStringMapIndex(const WStringMapIndex& other);
  93. // constructor from a string (copies the string's data into the new object)
  94. WStringMapIndex(const LLWString& str);
  95. // constructor from pointer and length
  96. // NOTE: does NOT copy data, caller must ensure that the lifetime of the pointer exceeds that of the new object!
  97. WStringMapIndex(const llwchar *start, size_t length);
  98. ~WStringMapIndex();
  99. bool operator<(const WStringMapIndex &other) const;
  100. private:
  101. void copyData(const llwchar *start, size_t length);
  102. const llwchar *mData;
  103. size_t mLength;
  104. bool mOwner;
  105. };
  106. typedef std::map<WStringMapIndex, LLKeywordToken*> word_token_map_t;
  107. typedef word_token_map_t::const_iterator keyword_iterator_t;
  108. keyword_iterator_t begin() const { return mWordTokenMap.begin(); }
  109. keyword_iterator_t end() const { return mWordTokenMap.end(); }
  110. #ifdef _DEBUG
  111. void dump();
  112. #endif
  113. private:
  114. LLColor3 readColor(const std::string& s);
  115. void insertSegment(std::vector<LLTextSegmentPtr> *seg_list, LLTextSegmentPtr new_segment, S32 text_len, const LLColor4 &defaultColor, class LLTextEditor& editor);
  116. BOOL mLoaded;
  117. word_token_map_t mWordTokenMap;
  118. typedef std::deque<LLKeywordToken*> token_list_t;
  119. token_list_t mLineTokenList;
  120. token_list_t mDelimiterTokenList;
  121. };
  122. #endif  // LL_LLKEYWORDS_H