mirror of
https://github.com/dlang/dmd.git
synced 2025-04-28 14:10:11 +03:00
Finished flattening D1/D2 differences. Except for one or two lines, all differences between the D1 and D2 runtimes is now strictly additive.
This commit is contained in:
parent
0a57c36dda
commit
1ff99272c7
46 changed files with 566 additions and 485 deletions
|
@ -175,5 +175,5 @@ class Exception : Object
|
||||||
|
|
||||||
this(string msg, Exception next = null);
|
this(string msg, Exception next = null);
|
||||||
this(string msg, string file, size_t line, Exception next = null);
|
this(string msg, string file, size_t line, Exception next = null);
|
||||||
string toString();
|
override string toString();
|
||||||
}
|
}
|
||||||
|
|
|
@ -222,7 +222,7 @@ bool readFile( char[] name, inout char[] buf )
|
||||||
{
|
{
|
||||||
version( Windows )
|
version( Windows )
|
||||||
{
|
{
|
||||||
wchar* wnamez = toUTF16z( name );
|
auto wnamez = toUTF16z( name );
|
||||||
HANDLE file = CreateFileW( wnamez,
|
HANDLE file = CreateFileW( wnamez,
|
||||||
GENERIC_READ,
|
GENERIC_READ,
|
||||||
FILE_SHARE_READ,
|
FILE_SHARE_READ,
|
||||||
|
|
|
@ -42,34 +42,34 @@ extern (C) void thread_joinAll();
|
||||||
* These functions must be defined for any D program linked
|
* These functions must be defined for any D program linked
|
||||||
* against this library.
|
* against this library.
|
||||||
*/
|
*/
|
||||||
extern (C) void onAssertError( char[] file, size_t line );
|
extern (C) void onAssertError( string file, size_t line );
|
||||||
extern (C) void onAssertErrorMsg( char[] file, size_t line, char[] msg );
|
extern (C) void onAssertErrorMsg( string file, size_t line, string msg );
|
||||||
extern (C) void onArrayBoundsError( char[] file, size_t line );
|
extern (C) void onArrayBoundsError( string file, size_t line );
|
||||||
extern (C) void onSwitchError( char[] file, size_t line );
|
extern (C) void onSwitchError( string file, size_t line );
|
||||||
extern (C) bool runModuleUnitTests();
|
extern (C) bool runModuleUnitTests();
|
||||||
|
|
||||||
// this function is called from the utf module
|
// this function is called from the utf module
|
||||||
//extern (C) void onUnicodeError( char[] msg, size_t idx );
|
//extern (C) void onUnicodeError( string msg, size_t idx );
|
||||||
|
|
||||||
/***********************************
|
/***********************************
|
||||||
* These are internal callbacks for various language errors.
|
* These are internal callbacks for various language errors.
|
||||||
*/
|
*/
|
||||||
extern (C) void _d_assert( char[] file, uint line )
|
extern (C) void _d_assert( string file, uint line )
|
||||||
{
|
{
|
||||||
onAssertError( file, line );
|
onAssertError( file, line );
|
||||||
}
|
}
|
||||||
|
|
||||||
extern (C) static void _d_assert_msg( char[] msg, char[] file, uint line )
|
extern (C) static void _d_assert_msg( string msg, string file, uint line )
|
||||||
{
|
{
|
||||||
onAssertErrorMsg( file, line, msg );
|
onAssertErrorMsg( file, line, msg );
|
||||||
}
|
}
|
||||||
|
|
||||||
extern (C) void _d_array_bounds( char[] file, uint line )
|
extern (C) void _d_array_bounds( string file, uint line )
|
||||||
{
|
{
|
||||||
onArrayBoundsError( file, line );
|
onArrayBoundsError( file, line );
|
||||||
}
|
}
|
||||||
|
|
||||||
extern (C) void _d_switch_error( char[] file, uint line )
|
extern (C) void _d_switch_error( string file, uint line )
|
||||||
{
|
{
|
||||||
onSwitchError( file, line );
|
onSwitchError( file, line );
|
||||||
}
|
}
|
||||||
|
|
|
@ -216,7 +216,7 @@ struct OffsetTypeInfo
|
||||||
*/
|
*/
|
||||||
class TypeInfo
|
class TypeInfo
|
||||||
{
|
{
|
||||||
hash_t toHash()
|
override hash_t toHash()
|
||||||
{ hash_t hash;
|
{ hash_t hash;
|
||||||
|
|
||||||
foreach (char c; this.toString())
|
foreach (char c; this.toString())
|
||||||
|
@ -224,7 +224,7 @@ class TypeInfo
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
int opCmp(Object o)
|
override int opCmp(Object o)
|
||||||
{
|
{
|
||||||
if (this is o)
|
if (this is o)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -234,7 +234,7 @@ class TypeInfo
|
||||||
return dstrcmp(this.toString(), ti.toString());
|
return dstrcmp(this.toString(), ti.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t opEquals(Object o)
|
override equals_t opEquals(Object o)
|
||||||
{
|
{
|
||||||
/* TypeInfo instances are singletons, but duplicates can exist
|
/* TypeInfo instances are singletons, but duplicates can exist
|
||||||
* across DLL's. Therefore, comparing for a name match is
|
* across DLL's. Therefore, comparing for a name match is
|
||||||
|
@ -286,9 +286,9 @@ class TypeInfo
|
||||||
|
|
||||||
class TypeInfo_Typedef : TypeInfo
|
class TypeInfo_Typedef : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return name; }
|
override string toString() { return name; }
|
||||||
|
|
||||||
equals_t opEquals(Object o)
|
override equals_t opEquals(Object o)
|
||||||
{
|
{
|
||||||
TypeInfo_Typedef c;
|
TypeInfo_Typedef c;
|
||||||
return this is o ||
|
return this is o ||
|
||||||
|
@ -297,15 +297,15 @@ class TypeInfo_Typedef : TypeInfo
|
||||||
this.base == c.base);
|
this.base == c.base);
|
||||||
}
|
}
|
||||||
|
|
||||||
hash_t getHash(in void* p) { return base.getHash(p); }
|
override hash_t getHash(in void* p) { return base.getHash(p); }
|
||||||
equals_t equals(in void* p1, in void* p2) { return base.equals(p1, p2); }
|
override equals_t equals(in void* p1, in void* p2) { return base.equals(p1, p2); }
|
||||||
int compare(in void* p1, in void* p2) { return base.compare(p1, p2); }
|
override int compare(in void* p1, in void* p2) { return base.compare(p1, p2); }
|
||||||
size_t tsize() { return base.tsize(); }
|
override size_t tsize() { return base.tsize(); }
|
||||||
void swap(void* p1, void* p2) { return base.swap(p1, p2); }
|
override void swap(void* p1, void* p2) { return base.swap(p1, p2); }
|
||||||
|
|
||||||
TypeInfo next() { return base.next(); }
|
override TypeInfo next() { return base.next(); }
|
||||||
uint flags() { return base.flags(); }
|
override uint flags() { return base.flags(); }
|
||||||
void[] init() { return m_init.length ? m_init : base.init(); }
|
override void[] init() { return m_init.length ? m_init : base.init(); }
|
||||||
|
|
||||||
TypeInfo base;
|
TypeInfo base;
|
||||||
string name;
|
string name;
|
||||||
|
@ -319,9 +319,9 @@ class TypeInfo_Enum : TypeInfo_Typedef
|
||||||
|
|
||||||
class TypeInfo_Pointer : TypeInfo
|
class TypeInfo_Pointer : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return m_next.toString() ~ "*"; }
|
override string toString() { return m_next.toString() ~ "*"; }
|
||||||
|
|
||||||
equals_t opEquals(Object o)
|
override equals_t opEquals(Object o)
|
||||||
{
|
{
|
||||||
TypeInfo_Pointer c;
|
TypeInfo_Pointer c;
|
||||||
return this is o ||
|
return this is o ||
|
||||||
|
@ -329,17 +329,17 @@ class TypeInfo_Pointer : TypeInfo
|
||||||
this.m_next == c.m_next);
|
this.m_next == c.m_next);
|
||||||
}
|
}
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
return cast(hash_t)*cast(void**)p;
|
return cast(hash_t)*cast(void**)p;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(void**)p1 == *cast(void**)p2;
|
return *cast(void**)p1 == *cast(void**)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
if (*cast(void**)p1 < *cast(void**)p2)
|
if (*cast(void**)p1 < *cast(void**)p2)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -349,29 +349,29 @@ class TypeInfo_Pointer : TypeInfo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return (void*).sizeof;
|
return (void*).sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void* p1, void* p2)
|
override void swap(void* p1, void* p2)
|
||||||
{
|
{
|
||||||
void* tmp = *cast(void**)p1;
|
void* tmp = *cast(void**)p1;
|
||||||
*cast(void**)p1 = *cast(void**)p2;
|
*cast(void**)p1 = *cast(void**)p2;
|
||||||
*cast(void**)p2 = tmp;
|
*cast(void**)p2 = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeInfo next() { return m_next; }
|
override TypeInfo next() { return m_next; }
|
||||||
uint flags() { return 1; }
|
override uint flags() { return 1; }
|
||||||
|
|
||||||
TypeInfo m_next;
|
TypeInfo m_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
class TypeInfo_Array : TypeInfo
|
class TypeInfo_Array : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return value.toString() ~ "[]"; }
|
override string toString() { return value.toString() ~ "[]"; }
|
||||||
|
|
||||||
equals_t opEquals(Object o)
|
override equals_t opEquals(Object o)
|
||||||
{
|
{
|
||||||
TypeInfo_Array c;
|
TypeInfo_Array c;
|
||||||
return this is o ||
|
return this is o ||
|
||||||
|
@ -379,7 +379,7 @@ class TypeInfo_Array : TypeInfo
|
||||||
this.value == c.value);
|
this.value == c.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
size_t sz = value.tsize();
|
size_t sz = value.tsize();
|
||||||
hash_t hash = 0;
|
hash_t hash = 0;
|
||||||
|
@ -389,7 +389,7 @@ class TypeInfo_Array : TypeInfo
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
void[] a1 = *cast(void[]*)p1;
|
void[] a1 = *cast(void[]*)p1;
|
||||||
void[] a2 = *cast(void[]*)p2;
|
void[] a2 = *cast(void[]*)p2;
|
||||||
|
@ -404,7 +404,7 @@ class TypeInfo_Array : TypeInfo
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
void[] a1 = *cast(void[]*)p1;
|
void[] a1 = *cast(void[]*)p1;
|
||||||
void[] a2 = *cast(void[]*)p2;
|
void[] a2 = *cast(void[]*)p2;
|
||||||
|
@ -422,12 +422,12 @@ class TypeInfo_Array : TypeInfo
|
||||||
return cast(int)a1.length - cast(int)a2.length;
|
return cast(int)a1.length - cast(int)a2.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return (void[]).sizeof;
|
return (void[]).sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void* p1, void* p2)
|
override void swap(void* p1, void* p2)
|
||||||
{
|
{
|
||||||
void[] tmp = *cast(void[]*)p1;
|
void[] tmp = *cast(void[]*)p1;
|
||||||
*cast(void[]*)p1 = *cast(void[]*)p2;
|
*cast(void[]*)p1 = *cast(void[]*)p2;
|
||||||
|
@ -436,23 +436,23 @@ class TypeInfo_Array : TypeInfo
|
||||||
|
|
||||||
TypeInfo value;
|
TypeInfo value;
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint flags() { return 1; }
|
override uint flags() { return 1; }
|
||||||
}
|
}
|
||||||
|
|
||||||
class TypeInfo_StaticArray : TypeInfo
|
class TypeInfo_StaticArray : TypeInfo
|
||||||
{
|
{
|
||||||
string toString()
|
override string toString()
|
||||||
{
|
{
|
||||||
char [10] tmp = void;
|
char[10] tmp = void;
|
||||||
return value.toString() ~ "[" ~ tmp.intToString(len) ~ "]";
|
return cast(string)(value.toString() ~ "[" ~ tmp.intToString(len) ~ "]");
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t opEquals(Object o)
|
override equals_t opEquals(Object o)
|
||||||
{
|
{
|
||||||
TypeInfo_StaticArray c;
|
TypeInfo_StaticArray c;
|
||||||
return this is o ||
|
return this is o ||
|
||||||
|
@ -461,7 +461,7 @@ class TypeInfo_StaticArray : TypeInfo
|
||||||
this.value == c.value);
|
this.value == c.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
size_t sz = value.tsize();
|
size_t sz = value.tsize();
|
||||||
hash_t hash = 0;
|
hash_t hash = 0;
|
||||||
|
@ -470,7 +470,7 @@ class TypeInfo_StaticArray : TypeInfo
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
size_t sz = value.tsize();
|
size_t sz = value.tsize();
|
||||||
|
|
||||||
|
@ -482,7 +482,7 @@ class TypeInfo_StaticArray : TypeInfo
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
size_t sz = value.tsize();
|
size_t sz = value.tsize();
|
||||||
|
|
||||||
|
@ -495,12 +495,12 @@ class TypeInfo_StaticArray : TypeInfo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return len * value.tsize();
|
return len * value.tsize();
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void* p1, void* p2)
|
override void swap(void* p1, void* p2)
|
||||||
{
|
{
|
||||||
void* tmp;
|
void* tmp;
|
||||||
size_t sz = value.tsize();
|
size_t sz = value.tsize();
|
||||||
|
@ -522,9 +522,9 @@ class TypeInfo_StaticArray : TypeInfo
|
||||||
delete pbuffer;
|
delete pbuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
void[] init() { return value.init(); }
|
override void[] init() { return value.init(); }
|
||||||
TypeInfo next() { return value; }
|
override TypeInfo next() { return value; }
|
||||||
uint flags() { return value.flags(); }
|
override uint flags() { return value.flags(); }
|
||||||
|
|
||||||
TypeInfo value;
|
TypeInfo value;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
@ -532,12 +532,12 @@ class TypeInfo_StaticArray : TypeInfo
|
||||||
|
|
||||||
class TypeInfo_AssociativeArray : TypeInfo
|
class TypeInfo_AssociativeArray : TypeInfo
|
||||||
{
|
{
|
||||||
string toString()
|
override string toString()
|
||||||
{
|
{
|
||||||
return next.toString() ~ "[" ~ key.toString() ~ "]";
|
return cast(string)(next.toString() ~ "[" ~ key.toString() ~ "]");
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t opEquals(Object o)
|
override equals_t opEquals(Object o)
|
||||||
{
|
{
|
||||||
TypeInfo_AssociativeArray c;
|
TypeInfo_AssociativeArray c;
|
||||||
return this is o ||
|
return this is o ||
|
||||||
|
@ -548,13 +548,13 @@ class TypeInfo_AssociativeArray : TypeInfo
|
||||||
|
|
||||||
// BUG: need to add the rest of the functions
|
// BUG: need to add the rest of the functions
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return (char[int]).sizeof;
|
return (char[int]).sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeInfo next() { return value; }
|
override TypeInfo next() { return value; }
|
||||||
uint flags() { return 1; }
|
override uint flags() { return 1; }
|
||||||
|
|
||||||
TypeInfo value;
|
TypeInfo value;
|
||||||
TypeInfo key;
|
TypeInfo key;
|
||||||
|
@ -562,12 +562,12 @@ class TypeInfo_AssociativeArray : TypeInfo
|
||||||
|
|
||||||
class TypeInfo_Function : TypeInfo
|
class TypeInfo_Function : TypeInfo
|
||||||
{
|
{
|
||||||
string toString()
|
override string toString()
|
||||||
{
|
{
|
||||||
return next.toString() ~ "()";
|
return cast(string)(next.toString() ~ "()");
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t opEquals(Object o)
|
override equals_t opEquals(Object o)
|
||||||
{
|
{
|
||||||
TypeInfo_Function c;
|
TypeInfo_Function c;
|
||||||
return this is o ||
|
return this is o ||
|
||||||
|
@ -577,7 +577,7 @@ class TypeInfo_Function : TypeInfo
|
||||||
|
|
||||||
// BUG: need to add the rest of the functions
|
// BUG: need to add the rest of the functions
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return 0; // no size for functions
|
return 0; // no size for functions
|
||||||
}
|
}
|
||||||
|
@ -587,12 +587,12 @@ class TypeInfo_Function : TypeInfo
|
||||||
|
|
||||||
class TypeInfo_Delegate : TypeInfo
|
class TypeInfo_Delegate : TypeInfo
|
||||||
{
|
{
|
||||||
string toString()
|
override string toString()
|
||||||
{
|
{
|
||||||
return next.toString() ~ " delegate()";
|
return cast(string)(next.toString() ~ " delegate()");
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t opEquals(Object o)
|
override equals_t opEquals(Object o)
|
||||||
{
|
{
|
||||||
TypeInfo_Delegate c;
|
TypeInfo_Delegate c;
|
||||||
return this is o ||
|
return this is o ||
|
||||||
|
@ -602,22 +602,22 @@ class TypeInfo_Delegate : TypeInfo
|
||||||
|
|
||||||
// BUG: need to add the rest of the functions
|
// BUG: need to add the rest of the functions
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
alias int delegate() dg;
|
alias int delegate() dg;
|
||||||
return dg.sizeof;
|
return dg.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint flags() { return 1; }
|
override uint flags() { return 1; }
|
||||||
|
|
||||||
TypeInfo next;
|
TypeInfo next;
|
||||||
}
|
}
|
||||||
|
|
||||||
class TypeInfo_Class : TypeInfo
|
class TypeInfo_Class : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return info.name; }
|
override string toString() { return info.name; }
|
||||||
|
|
||||||
equals_t opEquals(Object o)
|
override equals_t opEquals(Object o)
|
||||||
{
|
{
|
||||||
TypeInfo_Class c;
|
TypeInfo_Class c;
|
||||||
return this is o ||
|
return this is o ||
|
||||||
|
@ -625,13 +625,13 @@ class TypeInfo_Class : TypeInfo
|
||||||
this.info.name == c.classinfo.name);
|
this.info.name == c.classinfo.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
Object o = *cast(Object*)p;
|
Object o = *cast(Object*)p;
|
||||||
return o ? o.toHash() : 0;
|
return o ? o.toHash() : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
Object o1 = *cast(Object*)p1;
|
Object o1 = *cast(Object*)p1;
|
||||||
Object o2 = *cast(Object*)p2;
|
Object o2 = *cast(Object*)p2;
|
||||||
|
@ -639,7 +639,7 @@ class TypeInfo_Class : TypeInfo
|
||||||
return (o1 is o2) || (o1 && o1.opEquals(o2));
|
return (o1 is o2) || (o1 && o1.opEquals(o2));
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
Object o1 = *cast(Object*)p1;
|
Object o1 = *cast(Object*)p1;
|
||||||
Object o2 = *cast(Object*)p2;
|
Object o2 = *cast(Object*)p2;
|
||||||
|
@ -661,14 +661,14 @@ class TypeInfo_Class : TypeInfo
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return Object.sizeof;
|
return Object.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint flags() { return 1; }
|
override uint flags() { return 1; }
|
||||||
|
|
||||||
OffsetTypeInfo[] offTi()
|
override OffsetTypeInfo[] offTi()
|
||||||
{
|
{
|
||||||
return (info.flags & 4) ? info.offTi : null;
|
return (info.flags & 4) ? info.offTi : null;
|
||||||
}
|
}
|
||||||
|
@ -678,9 +678,9 @@ class TypeInfo_Class : TypeInfo
|
||||||
|
|
||||||
class TypeInfo_Interface : TypeInfo
|
class TypeInfo_Interface : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return info.name; }
|
override string toString() { return info.name; }
|
||||||
|
|
||||||
equals_t opEquals(Object o)
|
override equals_t opEquals(Object o)
|
||||||
{
|
{
|
||||||
TypeInfo_Interface c;
|
TypeInfo_Interface c;
|
||||||
return this is o ||
|
return this is o ||
|
||||||
|
@ -688,7 +688,7 @@ class TypeInfo_Interface : TypeInfo
|
||||||
this.info.name == c.classinfo.name);
|
this.info.name == c.classinfo.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
Interface* pi = **cast(Interface ***)*cast(void**)p;
|
Interface* pi = **cast(Interface ***)*cast(void**)p;
|
||||||
Object o = cast(Object)(*cast(void**)p - pi.offset);
|
Object o = cast(Object)(*cast(void**)p - pi.offset);
|
||||||
|
@ -696,7 +696,7 @@ class TypeInfo_Interface : TypeInfo
|
||||||
return o.toHash();
|
return o.toHash();
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
Interface* pi = **cast(Interface ***)*cast(void**)p1;
|
Interface* pi = **cast(Interface ***)*cast(void**)p1;
|
||||||
Object o1 = cast(Object)(*cast(void**)p1 - pi.offset);
|
Object o1 = cast(Object)(*cast(void**)p1 - pi.offset);
|
||||||
|
@ -706,7 +706,7 @@ class TypeInfo_Interface : TypeInfo
|
||||||
return o1 == o2 || (o1 && o1.opCmp(o2) == 0);
|
return o1 == o2 || (o1 && o1.opCmp(o2) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
Interface* pi = **cast(Interface ***)*cast(void**)p1;
|
Interface* pi = **cast(Interface ***)*cast(void**)p1;
|
||||||
Object o1 = cast(Object)(*cast(void**)p1 - pi.offset);
|
Object o1 = cast(Object)(*cast(void**)p1 - pi.offset);
|
||||||
|
@ -730,21 +730,21 @@ class TypeInfo_Interface : TypeInfo
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return Object.sizeof;
|
return Object.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint flags() { return 1; }
|
override uint flags() { return 1; }
|
||||||
|
|
||||||
ClassInfo info;
|
ClassInfo info;
|
||||||
}
|
}
|
||||||
|
|
||||||
class TypeInfo_Struct : TypeInfo
|
class TypeInfo_Struct : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return name; }
|
override string toString() { return name; }
|
||||||
|
|
||||||
equals_t opEquals(Object o)
|
override equals_t opEquals(Object o)
|
||||||
{
|
{
|
||||||
TypeInfo_Struct s;
|
TypeInfo_Struct s;
|
||||||
return this is o ||
|
return this is o ||
|
||||||
|
@ -753,7 +753,7 @@ class TypeInfo_Struct : TypeInfo
|
||||||
this.init.length == s.init.length);
|
this.init.length == s.init.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
assert(p);
|
assert(p);
|
||||||
if (xtoHash)
|
if (xtoHash)
|
||||||
|
@ -778,7 +778,7 @@ class TypeInfo_Struct : TypeInfo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
if (p1 == p2)
|
if (p1 == p2)
|
||||||
return true;
|
return true;
|
||||||
|
@ -791,7 +791,7 @@ class TypeInfo_Struct : TypeInfo
|
||||||
return memcmp(p1, p2, init.length) == 0;
|
return memcmp(p1, p2, init.length) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
// Regard null references as always being "less than"
|
// Regard null references as always being "less than"
|
||||||
if (p1 != p2)
|
if (p1 != p2)
|
||||||
|
@ -812,14 +812,14 @@ class TypeInfo_Struct : TypeInfo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return init.length;
|
return init.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
void[] init() { return m_init; }
|
override void[] init() { return m_init; }
|
||||||
|
|
||||||
uint flags() { return m_flags; }
|
override uint flags() { return m_flags; }
|
||||||
|
|
||||||
string name;
|
string name;
|
||||||
void[] m_init; // initializer; init.ptr == null if 0 initialize
|
void[] m_init; // initializer; init.ptr == null if 0 initialize
|
||||||
|
@ -836,7 +836,7 @@ class TypeInfo_Tuple : TypeInfo
|
||||||
{
|
{
|
||||||
TypeInfo[] elements;
|
TypeInfo[] elements;
|
||||||
|
|
||||||
string toString()
|
override string toString()
|
||||||
{
|
{
|
||||||
string s = "(";
|
string s = "(";
|
||||||
foreach (i, element; elements)
|
foreach (i, element; elements)
|
||||||
|
@ -849,7 +849,7 @@ class TypeInfo_Tuple : TypeInfo
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t opEquals(Object o)
|
override equals_t opEquals(Object o)
|
||||||
{
|
{
|
||||||
if (this is o)
|
if (this is o)
|
||||||
return true;
|
return true;
|
||||||
|
@ -867,27 +867,27 @@ class TypeInfo_Tuple : TypeInfo
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void* p1, void* p2)
|
override void swap(void* p1, void* p2)
|
||||||
{
|
{
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
@ -927,7 +927,7 @@ class Exception : Object
|
||||||
this.info = traceContext();
|
this.info = traceContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
string toString()
|
override string toString()
|
||||||
{
|
{
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,10 +76,10 @@ static timer_t trace_ohd;
|
||||||
static Symbol** psymbols;
|
static Symbol** psymbols;
|
||||||
static uint nsymbols; // number of symbols
|
static uint nsymbols; // number of symbols
|
||||||
|
|
||||||
static char[] trace_logfilename = "trace.log";
|
static string trace_logfilename = "trace.log";
|
||||||
static FILE* fplog;
|
static FILE* fplog;
|
||||||
|
|
||||||
static char[] trace_deffilename = "trace.def";
|
static string trace_deffilename = "trace.def";
|
||||||
static FILE* fpdef;
|
static FILE* fpdef;
|
||||||
|
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@ static FILE* fpdef;
|
||||||
// 0 success
|
// 0 success
|
||||||
// !=0 failure
|
// !=0 failure
|
||||||
|
|
||||||
int trace_setlogfilename(char[] name)
|
int trace_setlogfilename(string name)
|
||||||
{
|
{
|
||||||
trace_logfilename = name;
|
trace_logfilename = name;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -103,7 +103,7 @@ int trace_setlogfilename(char[] name)
|
||||||
// 0 success
|
// 0 success
|
||||||
// !=0 failure
|
// !=0 failure
|
||||||
|
|
||||||
int trace_setdeffilename(char[] name)
|
int trace_setdeffilename(string name)
|
||||||
{
|
{
|
||||||
trace_deffilename = name;
|
trace_deffilename = name;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -150,7 +150,7 @@ static void stack_free(Stack *s)
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
// Qsort() comparison routine for array of pointers to SymPair's.
|
// Qsort() comparison routine for array of pointers to SymPair's.
|
||||||
|
|
||||||
static int sympair_cmp(void* e1, void* e2)
|
static int sympair_cmp(in void* e1, in void* e2)
|
||||||
{ SymPair** psp1;
|
{ SymPair** psp1;
|
||||||
SymPair** psp2;
|
SymPair** psp2;
|
||||||
|
|
||||||
|
@ -285,7 +285,7 @@ static void trace_array(Symbol *s)
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
// Qsort() comparison routine for array of pointers to Symbol's.
|
// Qsort() comparison routine for array of pointers to Symbol's.
|
||||||
|
|
||||||
static int symbol_cmp(void* e1, void* e2)
|
static int symbol_cmp(in void* e1, in void* e2)
|
||||||
{ Symbol** ps1;
|
{ Symbol** ps1;
|
||||||
Symbol** ps2;
|
Symbol** ps2;
|
||||||
timer_t diff;
|
timer_t diff;
|
||||||
|
|
|
@ -4,7 +4,7 @@ module rt.typeinfo.ti_AC;
|
||||||
|
|
||||||
class TypeInfo_AC : TypeInfo
|
class TypeInfo_AC : TypeInfo
|
||||||
{
|
{
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{ Object[] s = *cast(Object[]*)p;
|
{ Object[] s = *cast(Object[]*)p;
|
||||||
hash_t hash = 0;
|
hash_t hash = 0;
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ class TypeInfo_AC : TypeInfo
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
Object[] s1 = *cast(Object[]*)p1;
|
Object[] s1 = *cast(Object[]*)p1;
|
||||||
Object[] s2 = *cast(Object[]*)p2;
|
Object[] s2 = *cast(Object[]*)p2;
|
||||||
|
@ -38,7 +38,7 @@ class TypeInfo_AC : TypeInfo
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
Object[] s1 = *cast(Object[]*)p1;
|
Object[] s1 = *cast(Object[]*)p1;
|
||||||
Object[] s2 = *cast(Object[]*)p2;
|
Object[] s2 = *cast(Object[]*)p2;
|
||||||
|
@ -78,17 +78,17 @@ class TypeInfo_AC : TypeInfo
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return (Object[]).sizeof;
|
return (Object[]).sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint flags()
|
override uint flags()
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(Object);
|
return typeid(Object);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,9 +29,9 @@ private import typeinfo.ti_cdouble;
|
||||||
|
|
||||||
class TypeInfo_Ar : TypeInfo
|
class TypeInfo_Ar : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "cdouble[]"; }
|
override string toString() { return "cdouble[]"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{ cdouble[] s = *cast(cdouble[]*)p;
|
{ cdouble[] s = *cast(cdouble[]*)p;
|
||||||
size_t len = s.length;
|
size_t len = s.length;
|
||||||
cdouble *str = s.ptr;
|
cdouble *str = s.ptr;
|
||||||
|
@ -51,7 +51,7 @@ class TypeInfo_Ar : TypeInfo
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
cdouble[] s1 = *cast(cdouble[]*)p1;
|
cdouble[] s1 = *cast(cdouble[]*)p1;
|
||||||
cdouble[] s2 = *cast(cdouble[]*)p2;
|
cdouble[] s2 = *cast(cdouble[]*)p2;
|
||||||
|
@ -67,7 +67,7 @@ class TypeInfo_Ar : TypeInfo
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
cdouble[] s1 = *cast(cdouble[]*)p1;
|
cdouble[] s1 = *cast(cdouble[]*)p1;
|
||||||
cdouble[] s2 = *cast(cdouble[]*)p2;
|
cdouble[] s2 = *cast(cdouble[]*)p2;
|
||||||
|
@ -88,17 +88,17 @@ class TypeInfo_Ar : TypeInfo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return (cdouble[]).sizeof;
|
return (cdouble[]).sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint flags()
|
override uint flags()
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(cdouble);
|
return typeid(cdouble);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,9 +29,9 @@ private import typeinfo.ti_cfloat;
|
||||||
|
|
||||||
class TypeInfo_Aq : TypeInfo
|
class TypeInfo_Aq : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "cfloat[]"; }
|
override string toString() { return "cfloat[]"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{ cfloat[] s = *cast(cfloat[]*)p;
|
{ cfloat[] s = *cast(cfloat[]*)p;
|
||||||
size_t len = s.length;
|
size_t len = s.length;
|
||||||
cfloat *str = s.ptr;
|
cfloat *str = s.ptr;
|
||||||
|
@ -49,7 +49,7 @@ class TypeInfo_Aq : TypeInfo
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
cfloat[] s1 = *cast(cfloat[]*)p1;
|
cfloat[] s1 = *cast(cfloat[]*)p1;
|
||||||
cfloat[] s2 = *cast(cfloat[]*)p2;
|
cfloat[] s2 = *cast(cfloat[]*)p2;
|
||||||
|
@ -65,7 +65,7 @@ class TypeInfo_Aq : TypeInfo
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
cfloat[] s1 = *cast(cfloat[]*)p1;
|
cfloat[] s1 = *cast(cfloat[]*)p1;
|
||||||
cfloat[] s2 = *cast(cfloat[]*)p2;
|
cfloat[] s2 = *cast(cfloat[]*)p2;
|
||||||
|
@ -86,17 +86,17 @@ class TypeInfo_Aq : TypeInfo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return (cfloat[]).sizeof;
|
return (cfloat[]).sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint flags()
|
override uint flags()
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(cfloat);
|
return typeid(cfloat);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,9 +29,9 @@ private import typeinfo.ti_creal;
|
||||||
|
|
||||||
class TypeInfo_Ac : TypeInfo
|
class TypeInfo_Ac : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "creal[]"; }
|
override string toString() { return "creal[]"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{ creal[] s = *cast(creal[]*)p;
|
{ creal[] s = *cast(creal[]*)p;
|
||||||
size_t len = s.length;
|
size_t len = s.length;
|
||||||
creal *str = s.ptr;
|
creal *str = s.ptr;
|
||||||
|
@ -52,7 +52,7 @@ class TypeInfo_Ac : TypeInfo
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
creal[] s1 = *cast(creal[]*)p1;
|
creal[] s1 = *cast(creal[]*)p1;
|
||||||
creal[] s2 = *cast(creal[]*)p2;
|
creal[] s2 = *cast(creal[]*)p2;
|
||||||
|
@ -68,7 +68,7 @@ class TypeInfo_Ac : TypeInfo
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
creal[] s1 = *cast(creal[]*)p1;
|
creal[] s1 = *cast(creal[]*)p1;
|
||||||
creal[] s2 = *cast(creal[]*)p2;
|
creal[] s2 = *cast(creal[]*)p2;
|
||||||
|
@ -89,17 +89,17 @@ class TypeInfo_Ac : TypeInfo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return (creal[]).sizeof;
|
return (creal[]).sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint flags()
|
override uint flags()
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(creal);
|
return typeid(creal);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,9 +29,9 @@ private import typeinfo.ti_double;
|
||||||
|
|
||||||
class TypeInfo_Ad : TypeInfo
|
class TypeInfo_Ad : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "double[]"; }
|
override string toString() { return "double[]"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{ double[] s = *cast(double[]*)p;
|
{ double[] s = *cast(double[]*)p;
|
||||||
size_t len = s.length;
|
size_t len = s.length;
|
||||||
auto str = s.ptr;
|
auto str = s.ptr;
|
||||||
|
@ -49,7 +49,7 @@ class TypeInfo_Ad : TypeInfo
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
double[] s1 = *cast(double[]*)p1;
|
double[] s1 = *cast(double[]*)p1;
|
||||||
double[] s2 = *cast(double[]*)p2;
|
double[] s2 = *cast(double[]*)p2;
|
||||||
|
@ -65,7 +65,7 @@ class TypeInfo_Ad : TypeInfo
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
double[] s1 = *cast(double[]*)p1;
|
double[] s1 = *cast(double[]*)p1;
|
||||||
double[] s2 = *cast(double[]*)p2;
|
double[] s2 = *cast(double[]*)p2;
|
||||||
|
@ -86,17 +86,17 @@ class TypeInfo_Ad : TypeInfo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return (double[]).sizeof;
|
return (double[]).sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint flags()
|
override uint flags()
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(double);
|
return typeid(double);
|
||||||
}
|
}
|
||||||
|
@ -106,9 +106,9 @@ class TypeInfo_Ad : TypeInfo
|
||||||
|
|
||||||
class TypeInfo_Ap : TypeInfo_Ad
|
class TypeInfo_Ap : TypeInfo_Ad
|
||||||
{
|
{
|
||||||
string toString() { return "idouble[]"; }
|
override string toString() { return "idouble[]"; }
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(idouble);
|
return typeid(idouble);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,9 +29,9 @@ private import typeinfo.ti_float;
|
||||||
|
|
||||||
class TypeInfo_Af : TypeInfo
|
class TypeInfo_Af : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "float[]"; }
|
override string toString() { return "float[]"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{ float[] s = *cast(float[]*)p;
|
{ float[] s = *cast(float[]*)p;
|
||||||
size_t len = s.length;
|
size_t len = s.length;
|
||||||
auto str = s.ptr;
|
auto str = s.ptr;
|
||||||
|
@ -48,7 +48,7 @@ class TypeInfo_Af : TypeInfo
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
float[] s1 = *cast(float[]*)p1;
|
float[] s1 = *cast(float[]*)p1;
|
||||||
float[] s2 = *cast(float[]*)p2;
|
float[] s2 = *cast(float[]*)p2;
|
||||||
|
@ -64,7 +64,7 @@ class TypeInfo_Af : TypeInfo
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
float[] s1 = *cast(float[]*)p1;
|
float[] s1 = *cast(float[]*)p1;
|
||||||
float[] s2 = *cast(float[]*)p2;
|
float[] s2 = *cast(float[]*)p2;
|
||||||
|
@ -85,17 +85,17 @@ class TypeInfo_Af : TypeInfo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return (float[]).sizeof;
|
return (float[]).sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint flags()
|
override uint flags()
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(float);
|
return typeid(float);
|
||||||
}
|
}
|
||||||
|
@ -105,9 +105,9 @@ class TypeInfo_Af : TypeInfo
|
||||||
|
|
||||||
class TypeInfo_Ao : TypeInfo_Af
|
class TypeInfo_Ao : TypeInfo_Af
|
||||||
{
|
{
|
||||||
string toString() { return "ifloat[]"; }
|
override string toString() { return "ifloat[]"; }
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(ifloat);
|
return typeid(ifloat);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,9 +8,9 @@ private import stdc.string;
|
||||||
|
|
||||||
class TypeInfo_Ag : TypeInfo
|
class TypeInfo_Ag : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "byte[]"; }
|
override string toString() { return "byte[]"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{ byte[] s = *cast(byte[]*)p;
|
{ byte[] s = *cast(byte[]*)p;
|
||||||
size_t len = s.length;
|
size_t len = s.length;
|
||||||
byte *str = s.ptr;
|
byte *str = s.ptr;
|
||||||
|
@ -51,7 +51,7 @@ class TypeInfo_Ag : TypeInfo
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
byte[] s1 = *cast(byte[]*)p1;
|
byte[] s1 = *cast(byte[]*)p1;
|
||||||
byte[] s2 = *cast(byte[]*)p2;
|
byte[] s2 = *cast(byte[]*)p2;
|
||||||
|
@ -60,7 +60,7 @@ class TypeInfo_Ag : TypeInfo
|
||||||
memcmp(cast(byte *)s1, cast(byte *)s2, s1.length) == 0;
|
memcmp(cast(byte *)s1, cast(byte *)s2, s1.length) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
byte[] s1 = *cast(byte[]*)p1;
|
byte[] s1 = *cast(byte[]*)p1;
|
||||||
byte[] s2 = *cast(byte[]*)p2;
|
byte[] s2 = *cast(byte[]*)p2;
|
||||||
|
@ -81,17 +81,17 @@ class TypeInfo_Ag : TypeInfo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return (byte[]).sizeof;
|
return (byte[]).sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint flags()
|
override uint flags()
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(byte);
|
return typeid(byte);
|
||||||
}
|
}
|
||||||
|
@ -102,9 +102,9 @@ class TypeInfo_Ag : TypeInfo
|
||||||
|
|
||||||
class TypeInfo_Ah : TypeInfo_Ag
|
class TypeInfo_Ah : TypeInfo_Ag
|
||||||
{
|
{
|
||||||
string toString() { return "ubyte[]"; }
|
override string toString() { return "ubyte[]"; }
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
char[] s1 = *cast(char[]*)p1;
|
char[] s1 = *cast(char[]*)p1;
|
||||||
char[] s2 = *cast(char[]*)p2;
|
char[] s2 = *cast(char[]*)p2;
|
||||||
|
@ -112,7 +112,7 @@ class TypeInfo_Ah : TypeInfo_Ag
|
||||||
return dstrcmp(s1, s2);
|
return dstrcmp(s1, s2);
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(ubyte);
|
return typeid(ubyte);
|
||||||
}
|
}
|
||||||
|
@ -122,9 +122,9 @@ class TypeInfo_Ah : TypeInfo_Ag
|
||||||
|
|
||||||
class TypeInfo_Av : TypeInfo_Ah
|
class TypeInfo_Av : TypeInfo_Ah
|
||||||
{
|
{
|
||||||
string toString() { return "void[]"; }
|
override string toString() { return "void[]"; }
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(void);
|
return typeid(void);
|
||||||
}
|
}
|
||||||
|
@ -134,9 +134,9 @@ class TypeInfo_Av : TypeInfo_Ah
|
||||||
|
|
||||||
class TypeInfo_Ab : TypeInfo_Ah
|
class TypeInfo_Ab : TypeInfo_Ah
|
||||||
{
|
{
|
||||||
string toString() { return "bool[]"; }
|
override string toString() { return "bool[]"; }
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(bool);
|
return typeid(bool);
|
||||||
}
|
}
|
||||||
|
@ -146,9 +146,9 @@ class TypeInfo_Ab : TypeInfo_Ah
|
||||||
|
|
||||||
class TypeInfo_Aa : TypeInfo_Ag
|
class TypeInfo_Aa : TypeInfo_Ag
|
||||||
{
|
{
|
||||||
string toString() { return "char[]"; }
|
override string toString() { return "char[]"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{ char[] s = *cast(char[]*)p;
|
{ char[] s = *cast(char[]*)p;
|
||||||
hash_t hash = 0;
|
hash_t hash = 0;
|
||||||
|
|
||||||
|
@ -197,7 +197,7 @@ else
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(char);
|
return typeid(char);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,9 +7,9 @@ private import stdc.string;
|
||||||
|
|
||||||
class TypeInfo_Ai : TypeInfo
|
class TypeInfo_Ai : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "int[]"; }
|
override string toString() { return "int[]"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{ int[] s = *cast(int[]*)p;
|
{ int[] s = *cast(int[]*)p;
|
||||||
auto len = s.length;
|
auto len = s.length;
|
||||||
auto str = s.ptr;
|
auto str = s.ptr;
|
||||||
|
@ -26,7 +26,7 @@ class TypeInfo_Ai : TypeInfo
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
int[] s1 = *cast(int[]*)p1;
|
int[] s1 = *cast(int[]*)p1;
|
||||||
int[] s2 = *cast(int[]*)p2;
|
int[] s2 = *cast(int[]*)p2;
|
||||||
|
@ -35,7 +35,7 @@ class TypeInfo_Ai : TypeInfo
|
||||||
memcmp(cast(void *)s1, cast(void *)s2, s1.length * int.sizeof) == 0;
|
memcmp(cast(void *)s1, cast(void *)s2, s1.length * int.sizeof) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
int[] s1 = *cast(int[]*)p1;
|
int[] s1 = *cast(int[]*)p1;
|
||||||
int[] s2 = *cast(int[]*)p2;
|
int[] s2 = *cast(int[]*)p2;
|
||||||
|
@ -56,17 +56,17 @@ class TypeInfo_Ai : TypeInfo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return (int[]).sizeof;
|
return (int[]).sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint flags()
|
override uint flags()
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(int);
|
return typeid(int);
|
||||||
}
|
}
|
||||||
|
@ -87,9 +87,9 @@ unittest
|
||||||
|
|
||||||
class TypeInfo_Ak : TypeInfo_Ai
|
class TypeInfo_Ak : TypeInfo_Ai
|
||||||
{
|
{
|
||||||
string toString() { return "uint[]"; }
|
override string toString() { return "uint[]"; }
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
uint[] s1 = *cast(uint[]*)p1;
|
uint[] s1 = *cast(uint[]*)p1;
|
||||||
uint[] s2 = *cast(uint[]*)p2;
|
uint[] s2 = *cast(uint[]*)p2;
|
||||||
|
@ -110,7 +110,7 @@ class TypeInfo_Ak : TypeInfo_Ai
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(uint);
|
return typeid(uint);
|
||||||
}
|
}
|
||||||
|
@ -120,9 +120,9 @@ class TypeInfo_Ak : TypeInfo_Ai
|
||||||
|
|
||||||
class TypeInfo_Aw : TypeInfo_Ak
|
class TypeInfo_Aw : TypeInfo_Ak
|
||||||
{
|
{
|
||||||
string toString() { return "dchar[]"; }
|
override string toString() { return "dchar[]"; }
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(dchar);
|
return typeid(dchar);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,9 +7,9 @@ private import stdc.string;
|
||||||
|
|
||||||
class TypeInfo_Al : TypeInfo
|
class TypeInfo_Al : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "long[]"; }
|
override string toString() { return "long[]"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{ long[] s = *cast(long[]*)p;
|
{ long[] s = *cast(long[]*)p;
|
||||||
size_t len = s.length;
|
size_t len = s.length;
|
||||||
auto str = s.ptr;
|
auto str = s.ptr;
|
||||||
|
@ -26,7 +26,7 @@ class TypeInfo_Al : TypeInfo
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
long[] s1 = *cast(long[]*)p1;
|
long[] s1 = *cast(long[]*)p1;
|
||||||
long[] s2 = *cast(long[]*)p2;
|
long[] s2 = *cast(long[]*)p2;
|
||||||
|
@ -35,7 +35,7 @@ class TypeInfo_Al : TypeInfo
|
||||||
memcmp(cast(void *)s1, cast(void *)s2, s1.length * long.sizeof) == 0;
|
memcmp(cast(void *)s1, cast(void *)s2, s1.length * long.sizeof) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
long[] s1 = *cast(long[]*)p1;
|
long[] s1 = *cast(long[]*)p1;
|
||||||
long[] s2 = *cast(long[]*)p2;
|
long[] s2 = *cast(long[]*)p2;
|
||||||
|
@ -57,17 +57,17 @@ class TypeInfo_Al : TypeInfo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return (long[]).sizeof;
|
return (long[]).sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint flags()
|
override uint flags()
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(long);
|
return typeid(long);
|
||||||
}
|
}
|
||||||
|
@ -78,9 +78,9 @@ class TypeInfo_Al : TypeInfo
|
||||||
|
|
||||||
class TypeInfo_Am : TypeInfo_Al
|
class TypeInfo_Am : TypeInfo_Al
|
||||||
{
|
{
|
||||||
string toString() { return "ulong[]"; }
|
override string toString() { return "ulong[]"; }
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
ulong[] s1 = *cast(ulong[]*)p1;
|
ulong[] s1 = *cast(ulong[]*)p1;
|
||||||
ulong[] s2 = *cast(ulong[]*)p2;
|
ulong[] s2 = *cast(ulong[]*)p2;
|
||||||
|
@ -102,7 +102,7 @@ class TypeInfo_Am : TypeInfo_Al
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(ulong);
|
return typeid(ulong);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,9 +29,9 @@ private import typeinfo.ti_real;
|
||||||
|
|
||||||
class TypeInfo_Ae : TypeInfo
|
class TypeInfo_Ae : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "real[]"; }
|
override string toString() { return "real[]"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{ real[] s = *cast(real[]*)p;
|
{ real[] s = *cast(real[]*)p;
|
||||||
size_t len = s.length;
|
size_t len = s.length;
|
||||||
auto str = s.ptr;
|
auto str = s.ptr;
|
||||||
|
@ -50,7 +50,7 @@ class TypeInfo_Ae : TypeInfo
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
real[] s1 = *cast(real[]*)p1;
|
real[] s1 = *cast(real[]*)p1;
|
||||||
real[] s2 = *cast(real[]*)p2;
|
real[] s2 = *cast(real[]*)p2;
|
||||||
|
@ -66,7 +66,7 @@ class TypeInfo_Ae : TypeInfo
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
real[] s1 = *cast(real[]*)p1;
|
real[] s1 = *cast(real[]*)p1;
|
||||||
real[] s2 = *cast(real[]*)p2;
|
real[] s2 = *cast(real[]*)p2;
|
||||||
|
@ -87,17 +87,17 @@ class TypeInfo_Ae : TypeInfo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return (real[]).sizeof;
|
return (real[]).sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint flags()
|
override uint flags()
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(real);
|
return typeid(real);
|
||||||
}
|
}
|
||||||
|
@ -107,9 +107,9 @@ class TypeInfo_Ae : TypeInfo
|
||||||
|
|
||||||
class TypeInfo_Aj : TypeInfo_Ae
|
class TypeInfo_Aj : TypeInfo_Ae
|
||||||
{
|
{
|
||||||
string toString() { return "ireal[]"; }
|
override string toString() { return "ireal[]"; }
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(ireal);
|
return typeid(ireal);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,9 +7,9 @@ private import stdc.string;
|
||||||
|
|
||||||
class TypeInfo_As : TypeInfo
|
class TypeInfo_As : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "short[]"; }
|
override string toString() { return "short[]"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{ short[] s = *cast(short[]*)p;
|
{ short[] s = *cast(short[]*)p;
|
||||||
size_t len = s.length;
|
size_t len = s.length;
|
||||||
short *str = s.ptr;
|
short *str = s.ptr;
|
||||||
|
@ -39,7 +39,7 @@ class TypeInfo_As : TypeInfo
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
short[] s1 = *cast(short[]*)p1;
|
short[] s1 = *cast(short[]*)p1;
|
||||||
short[] s2 = *cast(short[]*)p2;
|
short[] s2 = *cast(short[]*)p2;
|
||||||
|
@ -48,7 +48,7 @@ class TypeInfo_As : TypeInfo
|
||||||
memcmp(cast(void *)s1, cast(void *)s2, s1.length * short.sizeof) == 0;
|
memcmp(cast(void *)s1, cast(void *)s2, s1.length * short.sizeof) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
short[] s1 = *cast(short[]*)p1;
|
short[] s1 = *cast(short[]*)p1;
|
||||||
short[] s2 = *cast(short[]*)p2;
|
short[] s2 = *cast(short[]*)p2;
|
||||||
|
@ -69,17 +69,17 @@ class TypeInfo_As : TypeInfo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return (short[]).sizeof;
|
return (short[]).sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint flags()
|
override uint flags()
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(short);
|
return typeid(short);
|
||||||
}
|
}
|
||||||
|
@ -90,9 +90,9 @@ class TypeInfo_As : TypeInfo
|
||||||
|
|
||||||
class TypeInfo_At : TypeInfo_As
|
class TypeInfo_At : TypeInfo_As
|
||||||
{
|
{
|
||||||
string toString() { return "ushort[]"; }
|
override string toString() { return "ushort[]"; }
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
ushort[] s1 = *cast(ushort[]*)p1;
|
ushort[] s1 = *cast(ushort[]*)p1;
|
||||||
ushort[] s2 = *cast(ushort[]*)p2;
|
ushort[] s2 = *cast(ushort[]*)p2;
|
||||||
|
@ -113,7 +113,7 @@ class TypeInfo_At : TypeInfo_As
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(ushort);
|
return typeid(ushort);
|
||||||
}
|
}
|
||||||
|
@ -123,9 +123,9 @@ class TypeInfo_At : TypeInfo_As
|
||||||
|
|
||||||
class TypeInfo_Au : TypeInfo_At
|
class TypeInfo_Au : TypeInfo_At
|
||||||
{
|
{
|
||||||
string toString() { return "wchar[]"; }
|
override string toString() { return "wchar[]"; }
|
||||||
|
|
||||||
TypeInfo next()
|
override TypeInfo next()
|
||||||
{
|
{
|
||||||
return typeid(wchar);
|
return typeid(wchar);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,13 +27,13 @@ module rt.typeinfo.ti_C;
|
||||||
|
|
||||||
class TypeInfo_C : TypeInfo
|
class TypeInfo_C : TypeInfo
|
||||||
{
|
{
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
Object o = *cast(Object*)p;
|
Object o = *cast(Object*)p;
|
||||||
return o ? o.toHash() : 0;
|
return o ? o.toHash() : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
Object o1 = *cast(Object*)p1;
|
Object o1 = *cast(Object*)p1;
|
||||||
Object o2 = *cast(Object*)p2;
|
Object o2 = *cast(Object*)p2;
|
||||||
|
@ -41,7 +41,7 @@ class TypeInfo_C : TypeInfo
|
||||||
return o1 == o2;
|
return o1 == o2;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
Object o1 = *cast(Object*)p1;
|
Object o1 = *cast(Object*)p1;
|
||||||
Object o2 = *cast(Object*)p2;
|
Object o2 = *cast(Object*)p2;
|
||||||
|
@ -62,12 +62,12 @@ class TypeInfo_C : TypeInfo
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return Object.sizeof;
|
return Object.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint flags()
|
override uint flags()
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,29 +5,29 @@ module rt.typeinfo.ti_byte;
|
||||||
|
|
||||||
class TypeInfo_g : TypeInfo
|
class TypeInfo_g : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "byte"; }
|
override string toString() { return "byte"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
return *cast(byte *)p;
|
return *cast(byte *)p;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(byte *)p1 == *cast(byte *)p2;
|
return *cast(byte *)p1 == *cast(byte *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(byte *)p1 - *cast(byte *)p2;
|
return *cast(byte *)p1 - *cast(byte *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return byte.sizeof;
|
return byte.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
byte t;
|
byte t;
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,9 @@ module rt.typeinfo.ti_cdouble;
|
||||||
|
|
||||||
class TypeInfo_r : TypeInfo
|
class TypeInfo_r : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "cdouble"; }
|
override string toString() { return "cdouble"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
return (cast(uint *)p)[0] + (cast(uint *)p)[1] +
|
return (cast(uint *)p)[0] + (cast(uint *)p)[1] +
|
||||||
(cast(uint *)p)[2] + (cast(uint *)p)[3];
|
(cast(uint *)p)[2] + (cast(uint *)p)[3];
|
||||||
|
@ -34,22 +34,22 @@ class TypeInfo_r : TypeInfo
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return _equals(*cast(cdouble *)p1, *cast(cdouble *)p2);
|
return _equals(*cast(cdouble *)p1, *cast(cdouble *)p2);
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return _compare(*cast(cdouble *)p1, *cast(cdouble *)p2);
|
return _compare(*cast(cdouble *)p1, *cast(cdouble *)p2);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return cdouble.sizeof;
|
return cdouble.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
cdouble t;
|
cdouble t;
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ class TypeInfo_r : TypeInfo
|
||||||
*cast(cdouble *)p2 = t;
|
*cast(cdouble *)p2 = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
void[] init()
|
override void[] init()
|
||||||
{ static cdouble r;
|
{ static cdouble r;
|
||||||
|
|
||||||
return (cast(cdouble *)&r)[0 .. 1];
|
return (cast(cdouble *)&r)[0 .. 1];
|
||||||
|
|
|
@ -5,9 +5,9 @@ module rt.typeinfo.ti_cfloat;
|
||||||
|
|
||||||
class TypeInfo_q : TypeInfo
|
class TypeInfo_q : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "cfloat"; }
|
override string toString() { return "cfloat"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
return (cast(uint *)p)[0] + (cast(uint *)p)[1];
|
return (cast(uint *)p)[0] + (cast(uint *)p)[1];
|
||||||
}
|
}
|
||||||
|
@ -33,22 +33,22 @@ class TypeInfo_q : TypeInfo
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return _equals(*cast(cfloat *)p1, *cast(cfloat *)p2);
|
return _equals(*cast(cfloat *)p1, *cast(cfloat *)p2);
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return _compare(*cast(cfloat *)p1, *cast(cfloat *)p2);
|
return _compare(*cast(cfloat *)p1, *cast(cfloat *)p2);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return cfloat.sizeof;
|
return cfloat.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
cfloat t;
|
cfloat t;
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ class TypeInfo_q : TypeInfo
|
||||||
*cast(cfloat *)p2 = t;
|
*cast(cfloat *)p2 = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
void[] init()
|
override void[] init()
|
||||||
{ static cfloat r;
|
{ static cfloat r;
|
||||||
|
|
||||||
return (cast(cfloat *)&r)[0 .. 1];
|
return (cast(cfloat *)&r)[0 .. 1];
|
||||||
|
|
|
@ -3,29 +3,29 @@ module rt.typeinfo.ti_char;
|
||||||
|
|
||||||
class TypeInfo_a : TypeInfo
|
class TypeInfo_a : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "char"; }
|
override string toString() { return "char"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
return *cast(char *)p;
|
return *cast(char *)p;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(char *)p1 == *cast(char *)p2;
|
return *cast(char *)p1 == *cast(char *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(char *)p1 - *cast(char *)p2;
|
return *cast(char *)p1 - *cast(char *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return char.sizeof;
|
return char.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
char t;
|
char t;
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ class TypeInfo_a : TypeInfo
|
||||||
*cast(char *)p2 = t;
|
*cast(char *)p2 = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
void[] init()
|
override void[] init()
|
||||||
{ static char c;
|
{ static char c;
|
||||||
|
|
||||||
return (cast(char *)&c)[0 .. 1];
|
return (cast(char *)&c)[0 .. 1];
|
||||||
|
|
|
@ -5,9 +5,9 @@ module rt.typeinfo.ti_creal;
|
||||||
|
|
||||||
class TypeInfo_c : TypeInfo
|
class TypeInfo_c : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "creal"; }
|
override string toString() { return "creal"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
return (cast(uint *)p)[0] + (cast(uint *)p)[1] +
|
return (cast(uint *)p)[0] + (cast(uint *)p)[1] +
|
||||||
(cast(uint *)p)[2] + (cast(uint *)p)[3] +
|
(cast(uint *)p)[2] + (cast(uint *)p)[3] +
|
||||||
|
@ -35,22 +35,22 @@ class TypeInfo_c : TypeInfo
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return _equals(*cast(creal *)p1, *cast(creal *)p2);
|
return _equals(*cast(creal *)p1, *cast(creal *)p2);
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return _compare(*cast(creal *)p1, *cast(creal *)p2);
|
return _compare(*cast(creal *)p1, *cast(creal *)p2);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return creal.sizeof;
|
return creal.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
creal t;
|
creal t;
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ class TypeInfo_c : TypeInfo
|
||||||
*cast(creal *)p2 = t;
|
*cast(creal *)p2 = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
void[] init()
|
override void[] init()
|
||||||
{ static creal r;
|
{ static creal r;
|
||||||
|
|
||||||
return (cast(creal *)&r)[0 .. 1];
|
return (cast(creal *)&r)[0 .. 1];
|
||||||
|
|
|
@ -5,29 +5,29 @@ module rt.typeinfo.ti_dchar;
|
||||||
|
|
||||||
class TypeInfo_w : TypeInfo
|
class TypeInfo_w : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "dchar"; }
|
override string toString() { return "dchar"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
return *cast(dchar *)p;
|
return *cast(dchar *)p;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(dchar *)p1 == *cast(dchar *)p2;
|
return *cast(dchar *)p1 == *cast(dchar *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(dchar *)p1 - *cast(dchar *)p2;
|
return *cast(dchar *)p1 - *cast(dchar *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return dchar.sizeof;
|
return dchar.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
dchar t;
|
dchar t;
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ class TypeInfo_w : TypeInfo
|
||||||
*cast(dchar *)p2 = t;
|
*cast(dchar *)p2 = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
void[] init()
|
override void[] init()
|
||||||
{ static dchar c;
|
{ static dchar c;
|
||||||
|
|
||||||
return (cast(dchar *)&c)[0 .. 1];
|
return (cast(dchar *)&c)[0 .. 1];
|
||||||
|
|
|
@ -7,23 +7,23 @@ alias void delegate(int) dg;
|
||||||
|
|
||||||
class TypeInfo_D : TypeInfo
|
class TypeInfo_D : TypeInfo
|
||||||
{
|
{
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{ long l = *cast(long *)p;
|
{ long l = *cast(long *)p;
|
||||||
|
|
||||||
return cast(uint)(l + (l >> 32));
|
return cast(uint)(l + (l >> 32));
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(dg *)p1 == *cast(dg *)p2;
|
return *cast(dg *)p1 == *cast(dg *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return dg.sizeof;
|
return dg.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
dg t;
|
dg t;
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ class TypeInfo_D : TypeInfo
|
||||||
*cast(dg *)p2 = t;
|
*cast(dg *)p2 = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint flags()
|
override uint flags()
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,9 +5,9 @@ module rt.typeinfo.ti_double;
|
||||||
|
|
||||||
class TypeInfo_d : TypeInfo
|
class TypeInfo_d : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "double"; }
|
override string toString() { return "double"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
return (cast(uint *)p)[0] + (cast(uint *)p)[1];
|
return (cast(uint *)p)[0] + (cast(uint *)p)[1];
|
||||||
}
|
}
|
||||||
|
@ -32,22 +32,22 @@ class TypeInfo_d : TypeInfo
|
||||||
return (d1 == d2) ? 0 : ((d1 < d2) ? -1 : 1);
|
return (d1 == d2) ? 0 : ((d1 < d2) ? -1 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return _equals(*cast(double *)p1, *cast(double *)p2);
|
return _equals(*cast(double *)p1, *cast(double *)p2);
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return _compare(*cast(double *)p1, *cast(double *)p2);
|
return _compare(*cast(double *)p1, *cast(double *)p2);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return double.sizeof;
|
return double.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
double t;
|
double t;
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ class TypeInfo_d : TypeInfo
|
||||||
*cast(double *)p2 = t;
|
*cast(double *)p2 = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
void[] init()
|
override void[] init()
|
||||||
{ static double r;
|
{ static double r;
|
||||||
|
|
||||||
return (cast(double *)&r)[0 .. 1];
|
return (cast(double *)&r)[0 .. 1];
|
||||||
|
|
|
@ -5,9 +5,9 @@ module rt.typeinfo.ti_float;
|
||||||
|
|
||||||
class TypeInfo_f : TypeInfo
|
class TypeInfo_f : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "float"; }
|
override string toString() { return "float"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
return *cast(uint *)p;
|
return *cast(uint *)p;
|
||||||
}
|
}
|
||||||
|
@ -32,22 +32,22 @@ class TypeInfo_f : TypeInfo
|
||||||
return (d1 == d2) ? 0 : ((d1 < d2) ? -1 : 1);
|
return (d1 == d2) ? 0 : ((d1 < d2) ? -1 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return _equals(*cast(float *)p1, *cast(float *)p2);
|
return _equals(*cast(float *)p1, *cast(float *)p2);
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return _compare(*cast(float *)p1, *cast(float *)p2);
|
return _compare(*cast(float *)p1, *cast(float *)p2);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return float.sizeof;
|
return float.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
float t;
|
float t;
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ class TypeInfo_f : TypeInfo
|
||||||
*cast(float *)p2 = t;
|
*cast(float *)p2 = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
void[] init()
|
override void[] init()
|
||||||
{ static float r;
|
{ static float r;
|
||||||
|
|
||||||
return (cast(float *)&r)[0 .. 1];
|
return (cast(float *)&r)[0 .. 1];
|
||||||
|
|
|
@ -7,5 +7,5 @@ private import typeinfo.ti_double;
|
||||||
|
|
||||||
class TypeInfo_p : TypeInfo_d
|
class TypeInfo_p : TypeInfo_d
|
||||||
{
|
{
|
||||||
string toString() { return "idouble"; }
|
override string toString() { return "idouble"; }
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,5 +7,5 @@ private import typeinfo.ti_float;
|
||||||
|
|
||||||
class TypeInfo_o : TypeInfo_f
|
class TypeInfo_o : TypeInfo_f
|
||||||
{
|
{
|
||||||
string toString() { return "ifloat"; }
|
override string toString() { return "ifloat"; }
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,19 +5,19 @@ module rt.typeinfo.ti_int;
|
||||||
|
|
||||||
class TypeInfo_i : TypeInfo
|
class TypeInfo_i : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "int"; }
|
override string toString() { return "int"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
return *cast(uint *)p;
|
return *cast(uint *)p;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(uint *)p1 == *cast(uint *)p2;
|
return *cast(uint *)p1 == *cast(uint *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
if (*cast(int*) p1 < *cast(int*) p2)
|
if (*cast(int*) p1 < *cast(int*) p2)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -26,12 +26,12 @@ class TypeInfo_i : TypeInfo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return int.sizeof;
|
return int.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
int t;
|
int t;
|
||||||
|
|
||||||
|
|
|
@ -7,5 +7,5 @@ private import typeinfo.ti_real;
|
||||||
|
|
||||||
class TypeInfo_j : TypeInfo_e
|
class TypeInfo_j : TypeInfo_e
|
||||||
{
|
{
|
||||||
string toString() { return "ireal"; }
|
override string toString() { return "ireal"; }
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,19 +5,19 @@ module rt.typeinfo.ti_long;
|
||||||
|
|
||||||
class TypeInfo_l : TypeInfo
|
class TypeInfo_l : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "long"; }
|
override string toString() { return "long"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
return *cast(uint *)p + (cast(uint *)p)[1];
|
return *cast(uint *)p + (cast(uint *)p)[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(long *)p1 == *cast(long *)p2;
|
return *cast(long *)p1 == *cast(long *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
if (*cast(long *)p1 < *cast(long *)p2)
|
if (*cast(long *)p1 < *cast(long *)p2)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -26,12 +26,12 @@ class TypeInfo_l : TypeInfo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return long.sizeof;
|
return long.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
long t;
|
long t;
|
||||||
|
|
||||||
|
|
|
@ -5,17 +5,17 @@ module rt.typeinfo.ti_ptr;
|
||||||
|
|
||||||
class TypeInfo_P : TypeInfo
|
class TypeInfo_P : TypeInfo
|
||||||
{
|
{
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
return cast(uint)*cast(void* *)p;
|
return cast(uint)*cast(void* *)p;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(void* *)p1 == *cast(void* *)p2;
|
return *cast(void* *)p1 == *cast(void* *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
auto c = *cast(void* *)p1 - *cast(void* *)p2;
|
auto c = *cast(void* *)p1 - *cast(void* *)p2;
|
||||||
if (c < 0)
|
if (c < 0)
|
||||||
|
@ -25,12 +25,12 @@ class TypeInfo_P : TypeInfo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return (void*).sizeof;
|
return (void*).sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
void* t;
|
void* t;
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ class TypeInfo_P : TypeInfo
|
||||||
*cast(void* *)p2 = t;
|
*cast(void* *)p2 = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint flags()
|
override uint flags()
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,9 +5,9 @@ module rt.typeinfo.ti_real;
|
||||||
|
|
||||||
class TypeInfo_e : TypeInfo
|
class TypeInfo_e : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "real"; }
|
override string toString() { return "real"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
return (cast(uint *)p)[0] + (cast(uint *)p)[1] + (cast(ushort *)p)[4];
|
return (cast(uint *)p)[0] + (cast(uint *)p)[1] + (cast(ushort *)p)[4];
|
||||||
}
|
}
|
||||||
|
@ -32,22 +32,22 @@ class TypeInfo_e : TypeInfo
|
||||||
return (d1 == d2) ? 0 : ((d1 < d2) ? -1 : 1);
|
return (d1 == d2) ? 0 : ((d1 < d2) ? -1 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return _equals(*cast(real *)p1, *cast(real *)p2);
|
return _equals(*cast(real *)p1, *cast(real *)p2);
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return _compare(*cast(real *)p1, *cast(real *)p2);
|
return _compare(*cast(real *)p1, *cast(real *)p2);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return real.sizeof;
|
return real.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
real t;
|
real t;
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ class TypeInfo_e : TypeInfo
|
||||||
*cast(real *)p2 = t;
|
*cast(real *)p2 = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
void[] init()
|
override void[] init()
|
||||||
{ static real r;
|
{ static real r;
|
||||||
|
|
||||||
return (cast(real *)&r)[0 .. 1];
|
return (cast(real *)&r)[0 .. 1];
|
||||||
|
|
|
@ -5,29 +5,29 @@ module rt.typeinfo.ti_short;
|
||||||
|
|
||||||
class TypeInfo_s : TypeInfo
|
class TypeInfo_s : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "short"; }
|
override string toString() { return "short"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
return *cast(short *)p;
|
return *cast(short *)p;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(short *)p1 == *cast(short *)p2;
|
return *cast(short *)p1 == *cast(short *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(short *)p1 - *cast(short *)p2;
|
return *cast(short *)p1 - *cast(short *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return short.sizeof;
|
return short.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
short t;
|
short t;
|
||||||
|
|
||||||
|
|
|
@ -5,29 +5,29 @@ module rt.typeinfo.ti_ubyte;
|
||||||
|
|
||||||
class TypeInfo_h : TypeInfo
|
class TypeInfo_h : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "ubyte"; }
|
override string toString() { return "ubyte"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
return *cast(ubyte *)p;
|
return *cast(ubyte *)p;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(ubyte *)p1 == *cast(ubyte *)p2;
|
return *cast(ubyte *)p1 == *cast(ubyte *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(ubyte *)p1 - *cast(ubyte *)p2;
|
return *cast(ubyte *)p1 - *cast(ubyte *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return ubyte.sizeof;
|
return ubyte.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
ubyte t;
|
ubyte t;
|
||||||
|
|
||||||
|
@ -39,5 +39,5 @@ class TypeInfo_h : TypeInfo
|
||||||
|
|
||||||
class TypeInfo_b : TypeInfo_h
|
class TypeInfo_b : TypeInfo_h
|
||||||
{
|
{
|
||||||
string toString() { return "bool"; }
|
override string toString() { return "bool"; }
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,19 +5,19 @@ module rt.typeinfo.ti_uint;
|
||||||
|
|
||||||
class TypeInfo_k : TypeInfo
|
class TypeInfo_k : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "uint"; }
|
override string toString() { return "uint"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
return *cast(uint *)p;
|
return *cast(uint *)p;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(uint *)p1 == *cast(uint *)p2;
|
return *cast(uint *)p1 == *cast(uint *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
if (*cast(uint*) p1 < *cast(uint*) p2)
|
if (*cast(uint*) p1 < *cast(uint*) p2)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -26,12 +26,12 @@ class TypeInfo_k : TypeInfo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return uint.sizeof;
|
return uint.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
int t;
|
int t;
|
||||||
|
|
||||||
|
|
|
@ -5,19 +5,19 @@ module rt.typeinfo.ti_ulong;
|
||||||
|
|
||||||
class TypeInfo_m : TypeInfo
|
class TypeInfo_m : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "ulong"; }
|
override string toString() { return "ulong"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
return *cast(uint *)p + (cast(uint *)p)[1];
|
return *cast(uint *)p + (cast(uint *)p)[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(ulong *)p1 == *cast(ulong *)p2;
|
return *cast(ulong *)p1 == *cast(ulong *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
if (*cast(ulong *)p1 < *cast(ulong *)p2)
|
if (*cast(ulong *)p1 < *cast(ulong *)p2)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -26,12 +26,12 @@ class TypeInfo_m : TypeInfo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return ulong.sizeof;
|
return ulong.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
ulong t;
|
ulong t;
|
||||||
|
|
||||||
|
|
|
@ -5,29 +5,29 @@ module rt.typeinfo.ti_ushort;
|
||||||
|
|
||||||
class TypeInfo_t : TypeInfo
|
class TypeInfo_t : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "ushort"; }
|
override string toString() { return "ushort"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
return *cast(ushort *)p;
|
return *cast(ushort *)p;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(ushort *)p1 == *cast(ushort *)p2;
|
return *cast(ushort *)p1 == *cast(ushort *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(ushort *)p1 - *cast(ushort *)p2;
|
return *cast(ushort *)p1 - *cast(ushort *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return ushort.sizeof;
|
return ushort.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
ushort t;
|
ushort t;
|
||||||
|
|
||||||
|
|
|
@ -5,29 +5,29 @@ module rt.typeinfo.ti_void;
|
||||||
|
|
||||||
class TypeInfo_v : TypeInfo
|
class TypeInfo_v : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "void"; }
|
override string toString() { return "void"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(byte *)p1 == *cast(byte *)p2;
|
return *cast(byte *)p1 == *cast(byte *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(byte *)p1 - *cast(byte *)p2;
|
return *cast(byte *)p1 - *cast(byte *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return void.sizeof;
|
return void.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
byte t;
|
byte t;
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ class TypeInfo_v : TypeInfo
|
||||||
*cast(byte *)p2 = t;
|
*cast(byte *)p2 = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint flags()
|
override uint flags()
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,29 +4,29 @@ module rt.typeinfo.ti_wchar;
|
||||||
|
|
||||||
class TypeInfo_u : TypeInfo
|
class TypeInfo_u : TypeInfo
|
||||||
{
|
{
|
||||||
string toString() { return "wchar"; }
|
override string toString() { return "wchar"; }
|
||||||
|
|
||||||
hash_t getHash(in void* p)
|
override hash_t getHash(in void* p)
|
||||||
{
|
{
|
||||||
return *cast(wchar *)p;
|
return *cast(wchar *)p;
|
||||||
}
|
}
|
||||||
|
|
||||||
equals_t equals(in void* p1, in void* p2)
|
override equals_t equals(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(wchar *)p1 == *cast(wchar *)p2;
|
return *cast(wchar *)p1 == *cast(wchar *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(in void* p1, in void* p2)
|
override int compare(in void* p1, in void* p2)
|
||||||
{
|
{
|
||||||
return *cast(wchar *)p1 - *cast(wchar *)p2;
|
return *cast(wchar *)p1 - *cast(wchar *)p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tsize()
|
override size_t tsize()
|
||||||
{
|
{
|
||||||
return wchar.sizeof;
|
return wchar.sizeof;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(void *p1, void *p2)
|
override void swap(void *p1, void *p2)
|
||||||
{
|
{
|
||||||
wchar t;
|
wchar t;
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ class TypeInfo_u : TypeInfo
|
||||||
*cast(wchar *)p2 = t;
|
*cast(wchar *)p2 = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
void[] init()
|
override void[] init()
|
||||||
{ static wchar c;
|
{ static wchar c;
|
||||||
|
|
||||||
return (cast(wchar *)&c)[0 .. 1];
|
return (cast(wchar *)&c)[0 .. 1];
|
||||||
|
|
|
@ -47,7 +47,7 @@ version(D_InlineAsm_X86)
|
||||||
/// Returns vendor string
|
/// Returns vendor string
|
||||||
char[] vendor() {return vendorStr;}
|
char[] vendor() {return vendorStr;}
|
||||||
/// Returns processor string
|
/// Returns processor string
|
||||||
char[] processor() {return processorStr;}
|
string processor() {return processorStr;}
|
||||||
|
|
||||||
/// Is MMX supported?
|
/// Is MMX supported?
|
||||||
bool mmx() {return (flags&MMX_BIT)!=0;}
|
bool mmx() {return (flags&MMX_BIT)!=0;}
|
||||||
|
@ -186,8 +186,8 @@ private:
|
||||||
uint flags, misc, exflags, apic, signature;
|
uint flags, misc, exflags, apic, signature;
|
||||||
uint _stepping, _model, _family;
|
uint _stepping, _model, _family;
|
||||||
|
|
||||||
char[12] vendorStr = "";
|
char[12] vendorStr = 0;
|
||||||
char[] processorStr = "";
|
string processorStr = "";
|
||||||
|
|
||||||
uint maxThreads=1;
|
uint maxThreads=1;
|
||||||
uint maxCores=1;
|
uint maxCores=1;
|
||||||
|
@ -250,7 +250,7 @@ private:
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// seems many intel processors prepend whitespace
|
// seems many intel processors prepend whitespace
|
||||||
processorStr = strip(toString(dst)).dup;
|
processorStr = cast(string)strip(toString(dst)).dup;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void getFeatureFlags()
|
private void getFeatureFlags()
|
||||||
|
@ -421,9 +421,14 @@ private:
|
||||||
return stripr(stripl(s));
|
return stripr(stripl(s));
|
||||||
}
|
}
|
||||||
|
|
||||||
string toString(char *s)
|
char[] toString(char* s)
|
||||||
{
|
{
|
||||||
return s ? s[0 .. strlen(s)] : cast(char[])null;
|
return s ? s[0 .. strlen(s)] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
string toString(invariant(char)* s)
|
||||||
|
{
|
||||||
|
return s ? s[0 .. strlen(s)] : null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// utf.d
|
// Written in the D programming language
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2003-2004 by Digital Mars, www.digitalmars.com
|
* Copyright (C) 2003-2004 by Digital Mars, www.digitalmars.com
|
||||||
|
@ -22,16 +22,38 @@
|
||||||
* distribution.
|
* distribution.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Description of UTF-8 at:
|
/********************************************
|
||||||
// http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
* Encode and decode UTF-8, UTF-16 and UTF-32 strings.
|
||||||
// http://anubis.dkuug.dk/JTC1/SC2/WG2/docs/n1335
|
*
|
||||||
|
* For Win32 systems, the C wchar_t type is UTF-16 and corresponds to the D
|
||||||
|
* wchar type.
|
||||||
|
* For linux systems, the C wchar_t type is UTF-32 and corresponds to
|
||||||
|
* the D utf.dchar type.
|
||||||
|
*
|
||||||
|
* UTF character support is restricted to (\u0000 <= character <= \U0010FFFF).
|
||||||
|
*
|
||||||
|
* See_Also:
|
||||||
|
* $(LINK2 http://en.wikipedia.org/wiki/Unicode, Wikipedia)<br>
|
||||||
|
* $(LINK http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8)<br>
|
||||||
|
* $(LINK http://anubis.dkuug.dk/JTC1/SC2/WG2/docs/n1335)
|
||||||
|
* Macros:
|
||||||
|
* WIKI = Phobos/StdUtf
|
||||||
|
*/
|
||||||
|
|
||||||
module rt.util.utf;
|
module rt.util.utf;
|
||||||
|
|
||||||
|
|
||||||
extern (C) void onUnicodeError( char[] msg, size_t idx );
|
extern (C) void onUnicodeError( string msg, size_t idx );
|
||||||
|
|
||||||
|
/*******************************
|
||||||
|
* Test if c is a valid UTF-32 character.
|
||||||
|
*
|
||||||
|
* \uFFFE and \uFFFF are considered valid by this function,
|
||||||
|
* as they are permitted for internal use by an application,
|
||||||
|
* but they are not allowed for interchange by the Unicode standard.
|
||||||
|
*
|
||||||
|
* Returns: true if it is, false if not.
|
||||||
|
*/
|
||||||
|
|
||||||
bool isValidDchar(dchar c)
|
bool isValidDchar(dchar c)
|
||||||
{
|
{
|
||||||
|
@ -53,14 +75,10 @@ unittest
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* This array gives the length of a UTF-8 sequence indexed by the value
|
|
||||||
* of the leading byte. An FF represents an illegal starting value of
|
|
||||||
* a UTF-8 sequence.
|
|
||||||
* FF is used instead of 0 to avoid having loops hang.
|
|
||||||
*/
|
|
||||||
|
|
||||||
ubyte[256] UTF8stride =
|
auto UTF8stride =
|
||||||
[
|
[
|
||||||
|
cast(ubyte)
|
||||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||||
|
@ -79,77 +97,89 @@ ubyte[256] UTF8stride =
|
||||||
4,4,4,4,4,4,4,4,5,5,5,5,6,6,0xFF,0xFF,
|
4,4,4,4,4,4,4,4,5,5,5,5,6,6,0xFF,0xFF,
|
||||||
];
|
];
|
||||||
|
|
||||||
uint stride(char[] s, size_t i)
|
/**
|
||||||
|
* stride() returns the length of a UTF-8 sequence starting at index i
|
||||||
|
* in string s.
|
||||||
|
* Returns:
|
||||||
|
* The number of bytes in the UTF-8 sequence or
|
||||||
|
* 0xFF meaning s[i] is not the start of of UTF-8 sequence.
|
||||||
|
*/
|
||||||
|
uint stride(in char[] s, size_t i)
|
||||||
{
|
{
|
||||||
return UTF8stride[s[i]];
|
return UTF8stride[s[i]];
|
||||||
}
|
}
|
||||||
|
|
||||||
uint stride(wchar[] s, size_t i)
|
/**
|
||||||
|
* stride() returns the length of a UTF-16 sequence starting at index i
|
||||||
|
* in string s.
|
||||||
|
*/
|
||||||
|
uint stride(in wchar[] s, size_t i)
|
||||||
{ uint u = s[i];
|
{ uint u = s[i];
|
||||||
return 1 + (u >= 0xD800 && u <= 0xDBFF);
|
return 1 + (u >= 0xD800 && u <= 0xDBFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint stride(dchar[] s, size_t i)
|
/**
|
||||||
|
* stride() returns the length of a UTF-32 sequence starting at index i
|
||||||
|
* in string s.
|
||||||
|
* Returns: The return value will always be 1.
|
||||||
|
*/
|
||||||
|
uint stride(in dchar[] s, size_t i)
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************
|
/*******************************************
|
||||||
* Given an index into an array of char's,
|
* Given an index i into an array of characters s[],
|
||||||
* and assuming that index is at the start of a UTF character,
|
* and assuming that index i is at the start of a UTF character,
|
||||||
* determine the number of UCS characters up to that index.
|
* determine the number of UCS characters up to that index i.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
size_t toUCSindex(char[] s, size_t i)
|
size_t toUCSindex(in char[] s, size_t i)
|
||||||
{
|
|
||||||
size_t n;
|
|
||||||
size_t j;
|
|
||||||
size_t stride;
|
|
||||||
|
|
||||||
for (j = 0; j < i; j += stride)
|
|
||||||
{
|
|
||||||
stride = UTF8stride[s[j]];
|
|
||||||
if (stride == 0xFF)
|
|
||||||
goto Lerr;
|
|
||||||
n++;
|
|
||||||
}
|
|
||||||
if (j > i)
|
|
||||||
{
|
|
||||||
Lerr:
|
|
||||||
onUnicodeError("invalid UTF-8 sequence", j);
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t toUCSindex(wchar[] s, size_t i)
|
|
||||||
{
|
{
|
||||||
size_t n;
|
size_t n;
|
||||||
size_t j;
|
size_t j;
|
||||||
|
|
||||||
for (j = 0; j < i; )
|
for (j = 0; j < i; )
|
||||||
{ uint u = s[j];
|
{
|
||||||
|
j += stride(s, j);
|
||||||
j += 1 + (u >= 0xD800 && u <= 0xDBFF);
|
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
if (j > i)
|
if (j > i)
|
||||||
{
|
{
|
||||||
Lerr:
|
onUnicodeError("invalid UTF-8 sequence", j);
|
||||||
onUnicodeError("invalid UTF-16 sequence", j);
|
|
||||||
}
|
}
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t toUCSindex(dchar[] s, size_t i)
|
/** ditto */
|
||||||
|
size_t toUCSindex(in wchar[] s, size_t i)
|
||||||
|
{
|
||||||
|
size_t n;
|
||||||
|
size_t j;
|
||||||
|
|
||||||
|
for (j = 0; j < i; )
|
||||||
|
{
|
||||||
|
j += stride(s, j);
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
if (j > i)
|
||||||
|
{
|
||||||
|
onUnicodeError("invalid UTF-16 sequence", j);
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** ditto */
|
||||||
|
size_t toUCSindex(in dchar[] s, size_t i)
|
||||||
{
|
{
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************
|
/******************************************
|
||||||
* Given a UCS index into an array of characters, return the UTF index.
|
* Given a UCS index n into an array of characters s[], return the UTF index.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
size_t toUTFindex(char[] s, size_t n)
|
size_t toUTFindex(in char[] s, size_t n)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
|
@ -163,7 +193,8 @@ size_t toUTFindex(char[] s, size_t n)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t toUTFindex(wchar[] s, size_t n)
|
/** ditto */
|
||||||
|
size_t toUTFindex(in wchar[] s, size_t n)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
|
@ -175,14 +206,20 @@ size_t toUTFindex(wchar[] s, size_t n)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t toUTFindex(dchar[] s, size_t n)
|
/** ditto */
|
||||||
|
size_t toUTFindex(in dchar[] s, size_t n)
|
||||||
{
|
{
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* =================== Decode ======================= */
|
/* =================== Decode ======================= */
|
||||||
|
|
||||||
dchar decode(char[] s, inout size_t idx)
|
/***************
|
||||||
|
* Decodes and returns character starting at s[idx]. idx is advanced past the
|
||||||
|
* decoded character. If the character is not well formed, a UtfException is
|
||||||
|
* thrown and idx remains unchanged.
|
||||||
|
*/
|
||||||
|
dchar decode(in char[] s, inout size_t idx)
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
assert(idx >= 0 && idx < s.length);
|
assert(idx >= 0 && idx < s.length);
|
||||||
|
@ -275,7 +312,7 @@ unittest
|
||||||
|
|
||||||
debug(utf) printf("utf.decode.unittest\n");
|
debug(utf) printf("utf.decode.unittest\n");
|
||||||
|
|
||||||
static char[] s1 = "abcd";
|
static s1 = "abcd"c;
|
||||||
i = 0;
|
i = 0;
|
||||||
c = decode(s1, i);
|
c = decode(s1, i);
|
||||||
assert(c == cast(dchar)'a');
|
assert(c == cast(dchar)'a');
|
||||||
|
@ -284,20 +321,20 @@ unittest
|
||||||
assert(c == cast(dchar)'b');
|
assert(c == cast(dchar)'b');
|
||||||
assert(i == 2);
|
assert(i == 2);
|
||||||
|
|
||||||
static char[] s2 = "\xC2\xA9";
|
static s2 = "\xC2\xA9"c;
|
||||||
i = 0;
|
i = 0;
|
||||||
c = decode(s2, i);
|
c = decode(s2, i);
|
||||||
assert(c == cast(dchar)'\u00A9');
|
assert(c == cast(dchar)'\u00A9');
|
||||||
assert(i == 2);
|
assert(i == 2);
|
||||||
|
|
||||||
static char[] s3 = "\xE2\x89\xA0";
|
static s3 = "\xE2\x89\xA0"c;
|
||||||
i = 0;
|
i = 0;
|
||||||
c = decode(s3, i);
|
c = decode(s3, i);
|
||||||
assert(c == cast(dchar)'\u2260');
|
assert(c == cast(dchar)'\u2260');
|
||||||
assert(i == 3);
|
assert(i == 3);
|
||||||
|
|
||||||
static char[][] s4 =
|
static s4 =
|
||||||
[ "\xE2\x89", // too short
|
[ "\xE2\x89"c, // too short
|
||||||
"\xC0\x8A",
|
"\xC0\x8A",
|
||||||
"\xE0\x80\x8A",
|
"\xE0\x80\x8A",
|
||||||
"\xF0\x80\x80\x8A",
|
"\xF0\x80\x80\x8A",
|
||||||
|
@ -321,9 +358,9 @@ unittest
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************/
|
/** ditto */
|
||||||
|
|
||||||
dchar decode(wchar[] s, inout size_t idx)
|
dchar decode(in wchar[] s, inout size_t idx)
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
assert(idx >= 0 && idx < s.length);
|
assert(idx >= 0 && idx < s.length);
|
||||||
|
@ -334,7 +371,7 @@ dchar decode(wchar[] s, inout size_t idx)
|
||||||
}
|
}
|
||||||
body
|
body
|
||||||
{
|
{
|
||||||
char[] msg;
|
string msg;
|
||||||
dchar V;
|
dchar V;
|
||||||
size_t i = idx;
|
size_t i = idx;
|
||||||
uint u = s[i];
|
uint u = s[i];
|
||||||
|
@ -379,9 +416,9 @@ dchar decode(wchar[] s, inout size_t idx)
|
||||||
return cast(dchar)u; // dummy return
|
return cast(dchar)u; // dummy return
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************/
|
/** ditto */
|
||||||
|
|
||||||
dchar decode(dchar[] s, inout size_t idx)
|
dchar decode(in dchar[] s, inout size_t idx)
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
assert(idx >= 0 && idx < s.length);
|
assert(idx >= 0 && idx < s.length);
|
||||||
|
@ -404,6 +441,9 @@ dchar decode(dchar[] s, inout size_t idx)
|
||||||
|
|
||||||
/* =================== Encode ======================= */
|
/* =================== Encode ======================= */
|
||||||
|
|
||||||
|
/*******************************
|
||||||
|
* Encodes character c and appends it to array s[].
|
||||||
|
*/
|
||||||
void encode(inout char[] s, dchar c)
|
void encode(inout char[] s, dchar c)
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
|
@ -456,7 +496,7 @@ unittest
|
||||||
{
|
{
|
||||||
debug(utf) printf("utf.encode.unittest\n");
|
debug(utf) printf("utf.encode.unittest\n");
|
||||||
|
|
||||||
char[] s = "abcd";
|
char[] s = "abcd".dup;
|
||||||
encode(s, cast(dchar)'a');
|
encode(s, cast(dchar)'a');
|
||||||
assert(s.length == 5);
|
assert(s.length == 5);
|
||||||
assert(s == "abcda");
|
assert(s == "abcda");
|
||||||
|
@ -471,7 +511,7 @@ unittest
|
||||||
assert(s == "abcda\xC2\xA9\xE2\x89\xA0");
|
assert(s == "abcda\xC2\xA9\xE2\x89\xA0");
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************/
|
/** ditto */
|
||||||
|
|
||||||
void encode(inout wchar[] s, dchar c)
|
void encode(inout wchar[] s, dchar c)
|
||||||
in
|
in
|
||||||
|
@ -497,6 +537,7 @@ void encode(inout wchar[] s, dchar c)
|
||||||
s = r;
|
s = r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** ditto */
|
||||||
void encode(inout dchar[] s, dchar c)
|
void encode(inout dchar[] s, dchar c)
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
|
@ -507,36 +548,46 @@ void encode(inout dchar[] s, dchar c)
|
||||||
s ~= c;
|
s ~= c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns the code length of $(D c) in the encoding using $(D C) as a
|
||||||
|
code point. The code is returned in character count, not in bytes.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ubyte codeLength(C)(dchar c)
|
||||||
|
{
|
||||||
|
|
||||||
|
static if (C.sizeof == 1)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
c <= 0x7F ? 1
|
||||||
|
: c <= 0x7FF ? 2
|
||||||
|
: c <= 0xFFFF ? 3
|
||||||
|
: c <= 0x10FFFF ? 4
|
||||||
|
: (assert(false), 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
else static if (C.sizeof == 2)
|
||||||
|
{
|
||||||
|
return c <= 0xFFFF ? 1 : 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
static assert(C.sizeof == 4);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* =================== Validation ======================= */
|
/* =================== Validation ======================= */
|
||||||
|
|
||||||
void validate(char[] s)
|
/***********************************
|
||||||
|
Checks to see if string is well formed or not. $(D S) can be an array
|
||||||
|
of $(D char), $(D wchar), or $(D dchar). Throws a $(D UtfException)
|
||||||
|
if it is not. Use to check all untrusted input for correctness.
|
||||||
|
*/
|
||||||
|
void validate(S)(in S s)
|
||||||
{
|
{
|
||||||
size_t len = s.length;
|
invariant len = s.length;
|
||||||
size_t i;
|
for (size_t i = 0; i < len; )
|
||||||
|
|
||||||
for (i = 0; i < len; )
|
|
||||||
{
|
|
||||||
decode(s, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void validate(wchar[] s)
|
|
||||||
{
|
|
||||||
size_t len = s.length;
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
for (i = 0; i < len; )
|
|
||||||
{
|
|
||||||
decode(s, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void validate(dchar[] s)
|
|
||||||
{
|
|
||||||
size_t len = s.length;
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
for (i = 0; i < len; )
|
|
||||||
{
|
{
|
||||||
decode(s, i);
|
decode(s, i);
|
||||||
}
|
}
|
||||||
|
@ -580,7 +631,10 @@ char[] toUTF8(char[4] buf, dchar c)
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
char[] toUTF8(char[] s)
|
/*******************
|
||||||
|
* Encodes string s into UTF-8 and returns the encoded string.
|
||||||
|
*/
|
||||||
|
string toUTF8(string s)
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
validate(s);
|
validate(s);
|
||||||
|
@ -590,7 +644,8 @@ char[] toUTF8(char[] s)
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
char[] toUTF8(wchar[] s)
|
/** ditto */
|
||||||
|
string toUTF8(in wchar[] s)
|
||||||
{
|
{
|
||||||
char[] r;
|
char[] r;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
@ -613,10 +668,11 @@ char[] toUTF8(wchar[] s)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return r;
|
return cast(string)r;
|
||||||
}
|
}
|
||||||
|
|
||||||
char[] toUTF8(dchar[] s)
|
/** ditto */
|
||||||
|
string toUTF8(in dchar[] s)
|
||||||
{
|
{
|
||||||
char[] r;
|
char[] r;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
@ -639,7 +695,7 @@ char[] toUTF8(dchar[] s)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return r;
|
return cast(string)r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* =================== Conversion to UTF16 ======================= */
|
/* =================== Conversion to UTF16 ======================= */
|
||||||
|
@ -664,7 +720,12 @@ wchar[] toUTF16(wchar[2] buf, dchar c)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wchar[] toUTF16(char[] s)
|
/****************
|
||||||
|
* Encodes string s into UTF-16 and returns the encoded string.
|
||||||
|
* toUTF16z() is suitable for calling the 'W' functions in the Win32 API that take
|
||||||
|
* an LPWSTR or LPCWSTR argument.
|
||||||
|
*/
|
||||||
|
wstring toUTF16(in char[] s)
|
||||||
{
|
{
|
||||||
wchar[] r;
|
wchar[] r;
|
||||||
size_t slen = s.length;
|
size_t slen = s.length;
|
||||||
|
@ -685,10 +746,12 @@ wchar[] toUTF16(char[] s)
|
||||||
encode(r, c);
|
encode(r, c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return r;
|
return cast(wstring)r;
|
||||||
}
|
}
|
||||||
|
|
||||||
wchar* toUTF16z(char[] s)
|
alias const(wchar)* wptr;
|
||||||
|
/** ditto */
|
||||||
|
wptr toUTF16z(in char[] s)
|
||||||
{
|
{
|
||||||
wchar[] r;
|
wchar[] r;
|
||||||
size_t slen = s.length;
|
size_t slen = s.length;
|
||||||
|
@ -713,7 +776,8 @@ wchar* toUTF16z(char[] s)
|
||||||
return r.ptr;
|
return r.ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
wchar[] toUTF16(wchar[] s)
|
/** ditto */
|
||||||
|
wstring toUTF16(wstring s)
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
validate(s);
|
validate(s);
|
||||||
|
@ -723,7 +787,8 @@ wchar[] toUTF16(wchar[] s)
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
wchar[] toUTF16(dchar[] s)
|
/** ditto */
|
||||||
|
wstring toUTF16(in dchar[] s)
|
||||||
{
|
{
|
||||||
wchar[] r;
|
wchar[] r;
|
||||||
size_t slen = s.length;
|
size_t slen = s.length;
|
||||||
|
@ -734,12 +799,15 @@ wchar[] toUTF16(dchar[] s)
|
||||||
{
|
{
|
||||||
encode(r, s[i]);
|
encode(r, s[i]);
|
||||||
}
|
}
|
||||||
return r;
|
return cast(wstring)r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* =================== Conversion to UTF32 ======================= */
|
/* =================== Conversion to UTF32 ======================= */
|
||||||
|
|
||||||
dchar[] toUTF32(char[] s)
|
/*****
|
||||||
|
* Encodes string s into UTF-32 and returns the encoded string.
|
||||||
|
*/
|
||||||
|
dstring toUTF32(in char[] s)
|
||||||
{
|
{
|
||||||
dchar[] r;
|
dchar[] r;
|
||||||
size_t slen = s.length;
|
size_t slen = s.length;
|
||||||
|
@ -755,10 +823,11 @@ dchar[] toUTF32(char[] s)
|
||||||
i++; // c is ascii, no need for decode
|
i++; // c is ascii, no need for decode
|
||||||
r[j++] = c;
|
r[j++] = c;
|
||||||
}
|
}
|
||||||
return r[0 .. j];
|
return cast(dstring)r[0 .. j];
|
||||||
}
|
}
|
||||||
|
|
||||||
dchar[] toUTF32(wchar[] s)
|
/** ditto */
|
||||||
|
dstring toUTF32(in wchar[] s)
|
||||||
{
|
{
|
||||||
dchar[] r;
|
dchar[] r;
|
||||||
size_t slen = s.length;
|
size_t slen = s.length;
|
||||||
|
@ -774,10 +843,11 @@ dchar[] toUTF32(wchar[] s)
|
||||||
i++; // c is ascii, no need for decode
|
i++; // c is ascii, no need for decode
|
||||||
r[j++] = c;
|
r[j++] = c;
|
||||||
}
|
}
|
||||||
return r[0 .. j];
|
return cast(dstring)r[0 .. j];
|
||||||
}
|
}
|
||||||
|
|
||||||
dchar[] toUTF32(dchar[] s)
|
/** ditto */
|
||||||
|
dstring toUTF32(dstring s)
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
validate(s);
|
validate(s);
|
||||||
|
@ -793,14 +863,10 @@ unittest
|
||||||
{
|
{
|
||||||
debug(utf) printf("utf.toUTF.unittest\n");
|
debug(utf) printf("utf.toUTF.unittest\n");
|
||||||
|
|
||||||
char[] c;
|
auto c = "hello"c;
|
||||||
wchar[] w;
|
auto w = toUTF16(c);
|
||||||
dchar[] d;
|
|
||||||
|
|
||||||
c = "hello";
|
|
||||||
w = toUTF16(c);
|
|
||||||
assert(w == "hello");
|
assert(w == "hello");
|
||||||
d = toUTF32(c);
|
auto d = toUTF32(c);
|
||||||
assert(d == "hello");
|
assert(d == "hello");
|
||||||
|
|
||||||
c = toUTF8(w);
|
c = toUTF8(w);
|
||||||
|
@ -834,7 +900,7 @@ unittest
|
||||||
c = "he\U0010AAAAllo";
|
c = "he\U0010AAAAllo";
|
||||||
w = toUTF16(c);
|
w = toUTF16(c);
|
||||||
//foreach (wchar c; w) printf("c = x%x\n", c);
|
//foreach (wchar c; w) printf("c = x%x\n", c);
|
||||||
//foreach (wchar c; cast(wchar[])"he\U0010AAAAllo") printf("c = x%x\n", c);
|
//foreach (wchar c; cast(wstring)"he\U0010AAAAllo") printf("c = x%x\n", c);
|
||||||
assert(w == "he\U0010AAAAllo");
|
assert(w == "he\U0010AAAAllo");
|
||||||
d = toUTF32(c);
|
d = toUTF32(c);
|
||||||
assert(d == "he\U0010AAAAllo");
|
assert(d == "he\U0010AAAAllo");
|
||||||
|
|
|
@ -11,7 +11,7 @@ module exception;
|
||||||
|
|
||||||
private
|
private
|
||||||
{
|
{
|
||||||
alias void function( char[] file, size_t line, char[] msg = null ) assertHandlerType;
|
alias void function( string file, size_t line, string msg = null ) assertHandlerType;
|
||||||
|
|
||||||
assertHandlerType assertHandler = null;
|
assertHandlerType assertHandler = null;
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ private
|
||||||
*/
|
*/
|
||||||
class ArrayBoundsException : Exception
|
class ArrayBoundsException : Exception
|
||||||
{
|
{
|
||||||
this( char[] file, size_t line )
|
this( string file, size_t line )
|
||||||
{
|
{
|
||||||
super( "Array index out of bounds", file, line );
|
super( "Array index out of bounds", file, line );
|
||||||
}
|
}
|
||||||
|
@ -34,12 +34,12 @@ class ArrayBoundsException : Exception
|
||||||
*/
|
*/
|
||||||
class AssertException : Exception
|
class AssertException : Exception
|
||||||
{
|
{
|
||||||
this( char[] file, size_t line )
|
this( string file, size_t line )
|
||||||
{
|
{
|
||||||
super( "Assertion failure", file, line );
|
super( "Assertion failure", file, line );
|
||||||
}
|
}
|
||||||
|
|
||||||
this( char[] msg, char[] file, size_t line )
|
this( string msg, string file, size_t line )
|
||||||
{
|
{
|
||||||
super( msg, file, line );
|
super( msg, file, line );
|
||||||
}
|
}
|
||||||
|
@ -59,7 +59,7 @@ class FinalizeException : Exception
|
||||||
info = c;
|
info = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
string toString()
|
override string toString()
|
||||||
{
|
{
|
||||||
return "An exception was thrown while finalizing an instance of class " ~ info.name;
|
return "An exception was thrown while finalizing an instance of class " ~ info.name;
|
||||||
}
|
}
|
||||||
|
@ -71,12 +71,12 @@ class FinalizeException : Exception
|
||||||
*/
|
*/
|
||||||
class OutOfMemoryException : Exception
|
class OutOfMemoryException : Exception
|
||||||
{
|
{
|
||||||
this( char[] file, size_t line )
|
this( string file, size_t line )
|
||||||
{
|
{
|
||||||
super( "Memory allocation failed", file, line );
|
super( "Memory allocation failed", file, line );
|
||||||
}
|
}
|
||||||
|
|
||||||
string toString()
|
override string toString()
|
||||||
{
|
{
|
||||||
return msg ? super.toString() : "Memory allocation failed";
|
return msg ? super.toString() : "Memory allocation failed";
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,7 @@ class OutOfMemoryException : Exception
|
||||||
*/
|
*/
|
||||||
class SwitchException : Exception
|
class SwitchException : Exception
|
||||||
{
|
{
|
||||||
this( char[] file, size_t line )
|
this( string file, size_t line )
|
||||||
{
|
{
|
||||||
super( "No appropriate switch clause found", file, line );
|
super( "No appropriate switch clause found", file, line );
|
||||||
}
|
}
|
||||||
|
@ -102,7 +102,7 @@ class UnicodeException : Exception
|
||||||
{
|
{
|
||||||
size_t idx;
|
size_t idx;
|
||||||
|
|
||||||
this( char[] msg, size_t idx )
|
this( string msg, size_t idx )
|
||||||
{
|
{
|
||||||
super( msg );
|
super( msg );
|
||||||
this.idx = idx;
|
this.idx = idx;
|
||||||
|
@ -141,7 +141,7 @@ void setAssertHandler( assertHandlerType h )
|
||||||
* file = The name of the file that signaled this error.
|
* file = The name of the file that signaled this error.
|
||||||
* line = The line number on which this error occurred.
|
* line = The line number on which this error occurred.
|
||||||
*/
|
*/
|
||||||
extern (C) void onAssertError( char[] file, size_t line )
|
extern (C) void onAssertError( string file, size_t line )
|
||||||
{
|
{
|
||||||
if( assertHandler is null )
|
if( assertHandler is null )
|
||||||
throw new AssertException( file, line );
|
throw new AssertException( file, line );
|
||||||
|
@ -159,7 +159,7 @@ extern (C) void onAssertError( char[] file, size_t line )
|
||||||
* line = The line number on which this error occurred.
|
* line = The line number on which this error occurred.
|
||||||
* msg = An error message supplied by the user.
|
* msg = An error message supplied by the user.
|
||||||
*/
|
*/
|
||||||
extern (C) void onAssertErrorMsg( char[] file, size_t line, char[] msg )
|
extern (C) void onAssertErrorMsg( string file, size_t line, string msg )
|
||||||
{
|
{
|
||||||
if( assertHandler is null )
|
if( assertHandler is null )
|
||||||
throw new AssertException( msg, file, line );
|
throw new AssertException( msg, file, line );
|
||||||
|
@ -183,7 +183,7 @@ extern (C) void onAssertErrorMsg( char[] file, size_t line, char[] msg )
|
||||||
* Throws:
|
* Throws:
|
||||||
* ArrayBoundsException.
|
* ArrayBoundsException.
|
||||||
*/
|
*/
|
||||||
extern (C) void onArrayBoundsError( char[] file, size_t line )
|
extern (C) void onArrayBoundsError( string file, size_t line )
|
||||||
{
|
{
|
||||||
throw new ArrayBoundsException( file, line );
|
throw new ArrayBoundsException( file, line );
|
||||||
}
|
}
|
||||||
|
@ -229,7 +229,7 @@ extern (C) void onOutOfMemoryError()
|
||||||
* Throws:
|
* Throws:
|
||||||
* SwitchException.
|
* SwitchException.
|
||||||
*/
|
*/
|
||||||
extern (C) void onSwitchError( char[] file, size_t line )
|
extern (C) void onSwitchError( string file, size_t line )
|
||||||
{
|
{
|
||||||
throw new SwitchException( file, line );
|
throw new SwitchException( file, line );
|
||||||
}
|
}
|
||||||
|
@ -245,7 +245,7 @@ extern (C) void onSwitchError( char[] file, size_t line )
|
||||||
* Throws:
|
* Throws:
|
||||||
* UnicodeException.
|
* UnicodeException.
|
||||||
*/
|
*/
|
||||||
extern (C) void onUnicodeError( char[] msg, size_t idx )
|
extern (C) void onUnicodeError( string msg, size_t idx )
|
||||||
{
|
{
|
||||||
throw new UnicodeException( msg, idx );
|
throw new UnicodeException( msg, idx );
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,6 +112,11 @@ core.doc : $(ALL_DOCS)
|
||||||
bitmanip.o : bitmanip.d
|
bitmanip.o : bitmanip.d
|
||||||
$(DC) -c $(DFLAGS) bitmanip.d -of$@
|
$(DC) -c $(DFLAGS) bitmanip.d -of$@
|
||||||
|
|
||||||
|
### thread
|
||||||
|
|
||||||
|
thread.o : thread.d
|
||||||
|
$(DC) -c $(DFLAGS) -d -Hf$*.di thread.d -of$@
|
||||||
|
|
||||||
######################################################
|
######################################################
|
||||||
|
|
||||||
clean :
|
clean :
|
||||||
|
|
|
@ -22,7 +22,7 @@ version = StackGrowsDown;
|
||||||
*/
|
*/
|
||||||
class ThreadException : Exception
|
class ThreadException : Exception
|
||||||
{
|
{
|
||||||
this( char[] msg )
|
this( string msg )
|
||||||
{
|
{
|
||||||
super( msg );
|
super( msg );
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ class ThreadException : Exception
|
||||||
*/
|
*/
|
||||||
class FiberException : Exception
|
class FiberException : Exception
|
||||||
{
|
{
|
||||||
this( char[] msg )
|
this( string msg )
|
||||||
{
|
{
|
||||||
super( msg );
|
super( msg );
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,6 +108,11 @@ core.doc : $(ALL_DOCS)
|
||||||
bitmanip.obj : bitmanip.d
|
bitmanip.obj : bitmanip.d
|
||||||
$(DC) -c $(DFLAGS) bitmanip.d -of$@
|
$(DC) -c $(DFLAGS) bitmanip.d -of$@
|
||||||
|
|
||||||
|
### thread
|
||||||
|
|
||||||
|
thread.obj : thread.d
|
||||||
|
$(DC) -c $(DFLAGS) -d -Hf$*.di thread.d -of$@
|
||||||
|
|
||||||
######################################################
|
######################################################
|
||||||
|
|
||||||
clean :
|
clean :
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue