Core: String::Make

This commit is contained in:
Mirek Fidler 2021-09-13 08:59:05 +02:00
parent 9458f03c96
commit 54226f44d3
6 changed files with 278 additions and 4 deletions

View file

@ -0,0 +1,202 @@
* C:\upp\out\autotest\CLANGx64.Debug.Debug_Full\MakeString.exe 12.09.2021 08:56:40, user: cxl
Make(max(i, 14), i) =
Make(max(i, 31), i) =
Make(max(i, 40), i) =
Make(max(i, 200), i) =
Make(max(i, 14), i) = A
Make(max(i, 31), i) = A
Make(max(i, 40), i) = A
Make(max(i, 200), i) = A
Make(max(i, 14), i) = AB
Make(max(i, 31), i) = AB
Make(max(i, 40), i) = AB
Make(max(i, 200), i) = AB
Make(max(i, 14), i) = ABC
Make(max(i, 31), i) = ABC
Make(max(i, 40), i) = ABC
Make(max(i, 200), i) = ABC
Make(max(i, 14), i) = ABCD
Make(max(i, 31), i) = ABCD
Make(max(i, 40), i) = ABCD
Make(max(i, 200), i) = ABCD
Make(max(i, 14), i) = ABCDE
Make(max(i, 31), i) = ABCDE
Make(max(i, 40), i) = ABCDE
Make(max(i, 200), i) = ABCDE
Make(max(i, 14), i) = ABCDEF
Make(max(i, 31), i) = ABCDEF
Make(max(i, 40), i) = ABCDEF
Make(max(i, 200), i) = ABCDEF
Make(max(i, 14), i) = ABCDEFG
Make(max(i, 31), i) = ABCDEFG
Make(max(i, 40), i) = ABCDEFG
Make(max(i, 200), i) = ABCDEFG
Make(max(i, 14), i) = ABCDEFGH
Make(max(i, 31), i) = ABCDEFGH
Make(max(i, 40), i) = ABCDEFGH
Make(max(i, 200), i) = ABCDEFGH
Make(max(i, 14), i) = ABCDEFGHI
Make(max(i, 31), i) = ABCDEFGHI
Make(max(i, 40), i) = ABCDEFGHI
Make(max(i, 200), i) = ABCDEFGHI
Make(max(i, 14), i) = ABCDEFGHIJ
Make(max(i, 31), i) = ABCDEFGHIJ
Make(max(i, 40), i) = ABCDEFGHIJ
Make(max(i, 200), i) = ABCDEFGHIJ
Make(max(i, 14), i) = ABCDEFGHIJK
Make(max(i, 31), i) = ABCDEFGHIJK
Make(max(i, 40), i) = ABCDEFGHIJK
Make(max(i, 200), i) = ABCDEFGHIJK
Make(max(i, 14), i) = ABCDEFGHIJKL
Make(max(i, 31), i) = ABCDEFGHIJKL
Make(max(i, 40), i) = ABCDEFGHIJKL
Make(max(i, 200), i) = ABCDEFGHIJKL
Make(max(i, 14), i) = ABCDEFGHIJKLM
Make(max(i, 31), i) = ABCDEFGHIJKLM
Make(max(i, 40), i) = ABCDEFGHIJKLM
Make(max(i, 200), i) = ABCDEFGHIJKLM
Make(max(i, 14), i) = ABCDEFGHIJKLMN
Make(max(i, 31), i) = ABCDEFGHIJKLMN
Make(max(i, 40), i) = ABCDEFGHIJKLMN
Make(max(i, 200), i) = ABCDEFGHIJKLMN
Make(max(i, 14), i) = ABCDEFGHIJKLMNO
Make(max(i, 31), i) = ABCDEFGHIJKLMNO
Make(max(i, 40), i) = ABCDEFGHIJKLMNO
Make(max(i, 200), i) = ABCDEFGHIJKLMNO
Make(max(i, 14), i) = ABCDEFGHIJKLMNOP
Make(max(i, 31), i) = ABCDEFGHIJKLMNOP
Make(max(i, 40), i) = ABCDEFGHIJKLMNOP
Make(max(i, 200), i) = ABCDEFGHIJKLMNOP
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQ
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQ
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQ
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQ
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQR
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQR
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQR
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQR
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRS
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRS
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRS
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRS
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRST
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRST
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRST
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRST
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTU
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTU
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTU
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTU
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUV
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUV
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUV
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUV
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVW
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVW
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVW
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVW
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWX
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWX
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWX
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWX
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXY
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXY
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXY
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXY
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ab
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ab
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ab
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ab
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abc
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abc
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abc
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abc
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkl
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkl
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkl
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkl
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklm
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklm
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklm
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklm
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmno
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmno
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmno
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmno
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnop
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnop
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnop
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnop
Make(max(i, 14), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopq
Make(max(i, 31), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopq
Make(max(i, 40), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopq
Make(max(i, 200), i) = ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopq

View file

@ -0,0 +1,31 @@
#include <Core/Core.h>
using namespace Upp;
String Make(int alloc, int chars)
{
String s = String::Make(alloc, [&](char *t) {
for(int i = 0; i < chars; i++)
*t++ = 'A' + i;
return chars;
});
if(s.GetAlloc() > 32)
ASSERT(s.GetAlloc() < 2 * s.GetCount() + 32);
return s;
}
CONSOLE_APP_MAIN
{
StdLogSetup(LOG_COUT|LOG_FILE);
for(int i = 0; i < 50; i++) {
DUMP(Make(max(i, 14), i));
DUMP(Make(max(i, 31), i));
DUMP(Make(max(i, 40), i));
DUMP(Make(max(i, 200), i));
}
CheckLogEtalon();
}

View file

@ -0,0 +1,10 @@
uses
Core;
file
Etalon.log,
MakeString.cpp;
mainconfig
"" = "";

View file

@ -354,6 +354,35 @@ void String0::Swap(String0& b)
Dsyn(); b.Dsyn();
}
template <class Maker>
inline
String String::Make(int alloc, Maker m)
{
String s;
if(alloc <= 14) {
int len = m(s.chr);
ASSERT(len <= alloc);
s.SLen() = len;
s.Dsyn();
}
else {
if(alloc < 32) {
s.chr[KIND] = MEDIUM;
s.ptr = (char *)MemoryAlloc32();
}
else
s.ptr = s.Alloc(alloc, s.chr[KIND]);
int len = m(s.ptr);
ASSERT(len <= alloc);
s.ptr[len] = 0;
s.LLen() = len;
s.SLen() = 15;
if(alloc >= 32 && alloc > 2 * len)
s.Shrink();
}
return s;
}
force_inline
void StringBuffer::Strlen()
{

View file

@ -404,6 +404,9 @@ public:
template <class Maker>
static String MakeSmall(Maker m) { String s; int n = m(s.chr); ASSERT(n <= 14); s.SLen() = n; s.Dsyn(); return s; }
template <class Maker>
static String Make(int alloc, Maker m);
};
inline std::string to_string(const String& s) { return std::string(s.Begin(), s.End()); }

View file

@ -50,10 +50,9 @@ char *String0::Alloc(int count, char& kind)
void String0::SetL(const char *s, int len)
{
char *p = Alloc_(len, chr[KIND]);
memcpy8(p, s, len);
p[len] = 0;
ptr = p;
ptr = Alloc_(len, chr[KIND]);
memcpy8(ptr, s, len);
ptr[len] = 0;
LLen() = len;
SLen() = 15;
}