@@ -123,7 +123,73 @@ class LIBSCRATCHCPP_EXPORT List : public Entity
123123 return m_dataPtr->operator [](index);
124124 }
125125
126- std::string toString () const ;
126+ /* ! Joins the list items with spaces or without any separator if there are only digits and stores the result in dst. */
127+ inline void toString (std::string &dst) const
128+ {
129+ dst.clear ();
130+ veque::veque<std::string> strings;
131+ strings.reserve (m_dataPtr->size ());
132+ bool digits = true ;
133+
134+ for (const auto &item : *m_dataPtr) {
135+ strings.push_back (std::string ());
136+ value_toString (&item, &strings.back ());
137+
138+ if (value_isValidNumber (&item) && !strings.back ().empty ()) {
139+ double doubleNum = value_toDouble (&item);
140+ long num = value_toLong (&item);
141+
142+ if (doubleNum != num) {
143+ digits = false ;
144+ break ;
145+ }
146+
147+ if (num < 0 || num >= 10 ) {
148+ digits = false ;
149+ break ;
150+ }
151+ } else {
152+ digits = false ;
153+ break ;
154+ }
155+ }
156+
157+ size_t i;
158+ std::string s;
159+
160+ if (digits) {
161+ for (i = 0 ; i < strings.size (); i++)
162+ dst.append (strings[i]);
163+
164+ for (; i < m_dataPtr->size (); i++) {
165+ value_toString (&m_dataPtr->operator [](i), &s);
166+ dst.append (s);
167+ }
168+ } else {
169+ for (i = 0 ; i < strings.size (); i++) {
170+ dst.append (strings[i]);
171+
172+ if (i + 1 < m_dataPtr->size ())
173+ dst.push_back (' ' );
174+ }
175+
176+ for (; i < m_dataPtr->size (); i++) {
177+ value_toString (&m_dataPtr->operator [](i), &s);
178+ dst.append (s);
179+
180+ if (i + 1 < m_dataPtr->size ())
181+ dst.push_back (' ' );
182+ }
183+ }
184+ }
185+
186+ /* ! Same as the other method, but returns the result directly. */
187+ inline std::string toString () const
188+ {
189+ std::string ret;
190+ toString (ret);
191+ return ret;
192+ }
127193
128194 std::shared_ptr<List> clone ();
129195
0 commit comments