BufferStringBuilder.h 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #pragma once
  6. namespace Js
  7. {
  8. // Used when the final string has a known final length
  9. class BufferStringBuilder
  10. {
  11. public:
  12. BufferStringBuilder(charcount_t charLength, ScriptContext* scriptContext)
  13. : m_string( WritableString::New(charLength, scriptContext) )
  14. {
  15. }
  16. JavascriptString* ToString();
  17. void DbgAssertNotFrozen() const
  18. {
  19. AssertMsg(this->m_string != nullptr, "Do not call BufferStringBuilder methods after ToString() has been called.");
  20. }
  21. void SetContent(
  22. const char16* prefix, charcount_t cchPrefix,
  23. const char16* content, charcount_t cchContent,
  24. const char16* suffix, charcount_t cchSuffix)
  25. {
  26. DbgAssertNotFrozen();
  27. this->m_string->SetContent(prefix, cchPrefix, content, cchContent, suffix, cchSuffix);
  28. }
  29. // Caution: Do not retain the writable buffer after ToString has been called
  30. char16* DangerousGetWritableBuffer()
  31. {
  32. DbgAssertNotFrozen();
  33. return this->m_string->GetWritableBuffer();
  34. }
  35. class WritableString sealed : public JavascriptString
  36. {
  37. public:
  38. static WritableString* New(charcount_t length, ScriptContext* scriptContext);
  39. char16* GetWritableBuffer() const
  40. {
  41. return const_cast< char16* >( this->UnsafeGetBuffer() );
  42. }
  43. void SetContent(const char16* content, charcount_t offset, charcount_t length);
  44. void SetContent(const char16* prefix, charcount_t cchPrefix,
  45. const char16* content, charcount_t cchContent,
  46. const char16* suffix, charcount_t cchSuffix);
  47. protected:
  48. DEFINE_VTABLE_CTOR(WritableString, JavascriptString);
  49. private:
  50. WritableString(StaticType * type, charcount_t length, const char16* szValue)
  51. : JavascriptString(type, length, szValue)
  52. {
  53. }
  54. static char16* SafeCopyAndAdvancePtr(__out_ecount(cchDst) char16* dst, charcount_t& cchDst, __in_ecount(cch) const char16* ptr, charcount_t cch);
  55. };
  56. private:
  57. WritableString* m_string;
  58. #if DBG
  59. static const char16 k_dbgFill = _u('\xCDCD');
  60. #endif
  61. };
  62. // Needed by diagnostics vtable access
  63. typedef BufferStringBuilder::WritableString BufferStringBuilderWritableString;
  64. } // namespace Js