1 /** 2 * Copyright (c) 2023-2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef PANDA_RUNTIME_ETS_ETS_STRING_BUILDER_H 17 #define PANDA_RUNTIME_ETS_ETS_STRING_BUILDER_H 18 19 #include "runtime/include/object_header.h" 20 #include "plugins/ets/runtime/types/ets_string.h" 21 #include "plugins/ets/runtime/types/ets_primitives.h" 22 23 namespace ark::ets { 24 25 EtsString *StringBuilderToString(ObjectHeader *sb); 26 ObjectHeader *StringBuilderAppendNullString(ObjectHeader *sb); 27 ObjectHeader *StringBuilderAppendString(ObjectHeader *sb, EtsString *str); 28 ObjectHeader *StringBuilderAppendBool(ObjectHeader *sb, EtsBoolean v); 29 ObjectHeader *StringBuilderAppendChar(ObjectHeader *sb, EtsChar v); 30 ObjectHeader *StringBuilderAppendLong(ObjectHeader *sb, EtsLong v); 31 ObjectHeader *StringBuilderAppendFloat(ObjectHeader *sb, EtsFloat v); 32 ObjectHeader *StringBuilderAppendDouble(ObjectHeader *sb, EtsDouble v); 33 34 namespace test { 35 class EtsStringBuilderMembersTest; 36 } // namespace test 37 38 class EtsStringBuilder : public EtsObject { 39 public: 40 EtsStringBuilder() = delete; 41 ~EtsStringBuilder() = delete; 42 43 NO_COPY_SEMANTIC(EtsStringBuilder); 44 NO_MOVE_SEMANTIC(EtsStringBuilder); 45 FromCoreType(ObjectHeader * obj)46 static EtsStringBuilder *FromCoreType(ObjectHeader *obj) 47 { 48 return reinterpret_cast<EtsStringBuilder *>(obj); 49 } 50 GetCoreType()51 ObjectHeader *GetCoreType() 52 { 53 return reinterpret_cast<ObjectHeader *>(this); 54 } 55 AsObject()56 EtsObject *AsObject() 57 { 58 return this; 59 } 60 AsObject()61 const EtsObject *AsObject() const 62 { 63 return this; 64 } 65 FromEtsObject(EtsObject * etsObj)66 static EtsStringBuilder *FromEtsObject(EtsObject *etsObj) 67 { 68 return reinterpret_cast<EtsStringBuilder *>(etsObj); 69 } 70 GetBuf()71 EtsObjectArray *GetBuf() const 72 { 73 return buf_; 74 } 75 SetBuf(EtsCoroutine * coro,EtsObjectArray * buf)76 void SetBuf(EtsCoroutine *coro, EtsObjectArray *buf) 77 { 78 ObjectAccessor::SetObject(coro, this, MEMBER_OFFSET(EtsStringBuilder, buf_), buf->GetCoreType()); 79 } 80 GetIndex()81 EtsInt GetIndex() const 82 { 83 return index_; 84 } 85 SetIndex(EtsInt index)86 void SetIndex(EtsInt index) 87 { 88 index_ = index; 89 } 90 GetLength()91 EtsInt GetLength() const 92 { 93 return length_; 94 } 95 SetLength(EtsInt length)96 void SetLength(EtsInt length) 97 { 98 length_ = length; 99 } 100 GetCompress()101 EtsBoolean GetCompress() const 102 { 103 return compress_; 104 } 105 SetCompress(EtsBoolean compress)106 void SetCompress(EtsBoolean compress) 107 { 108 compress_ = compress; 109 } 110 111 private: 112 ObjectPointer<EtsObjectArray> buf_; // array with pointers to strings or char[] 113 EtsInt index_; // index of the current free element in the buf 114 EtsInt length_; // length of the resulting string 115 EtsBoolean compress_; // compress or not the resulting string 116 117 friend class test::EtsStringBuilderMembersTest; 118 }; 119 120 } // namespace ark::ets 121 122 #endif // PANDA_RUNTIME_ETS_ETS_STRING_BUILDER_H 123