Library: define string conversion trait more precisely

It is pointless to include pointers....
A pointer to string is not "basically a string",
and char is handled explicitly anyway.
This commit is contained in:
Fischlurch 2017-12-02 03:37:21 +01:00
parent e379ad82c6
commit 63a49bccfd
3 changed files with 170 additions and 7 deletions

View file

@ -266,8 +266,8 @@ namespace meta {
/** compare unadorned types, disregarding const and references */
template<typename T, typename U>
struct is_basically
: is_same <typename Strip<T>::TypePlain
,typename Strip<U>::TypePlain>
: is_same <typename Strip<T>::TypeReferred
,typename Strip<U>::TypeReferred>
{ };
/** detect various flavours of string / text data */

View file

@ -255,6 +255,158 @@ END
TEST "formatting/string conversion in output" FormatCOUT_test <<END
out-lit: Type: int ......
out-lit: is_StringLike<int> : No
out-lit: BasicallyString<int> : No
out-lit: BasicallyCString<int> : No
out-lit: std::is_arithmetic<int> : Yes
out-lit: can_lexical2string<int> : Yes
out-lit: can_convertToString<int> : No
out-lit: use_StringConversion4Stream<int> : No
out-lit: Type: char ......
out-lit: is_StringLike<char> : No
out-lit: BasicallyString<char> : No
out-lit: BasicallyCString<char> : No
out-lit: std::is_arithmetic<char> : Yes
out-lit: can_lexical2string<char> : Yes
out-lit: can_convertToString<char> : No
out-lit: use_StringConversion4Stream<char> : No
out-lit: Type: double ......
out-lit: is_StringLike<double> : No
out-lit: BasicallyString<double> : No
out-lit: BasicallyCString<double> : No
out-lit: std::is_arithmetic<double> : Yes
out-lit: can_lexical2string<double> : Yes
out-lit: can_convertToString<double> : No
out-lit: use_StringConversion4Stream<double> : No
out-lit: Type: int64_t ......
out-lit: is_StringLike<int64_t> : No
out-lit: BasicallyString<int64_t> : No
out-lit: BasicallyCString<int64_t> : No
out-lit: std::is_arithmetic<int64_t> : Yes
out-lit: can_lexical2string<int64_t> : Yes
out-lit: can_convertToString<int64_t> : No
out-lit: use_StringConversion4Stream<int64_t> : No
out-lit: Type: string ......
out-lit: is_StringLike<string> : Yes
out-lit: BasicallyString<string> : Yes
out-lit: BasicallyCString<string> : No
out-lit: std::is_arithmetic<string> : No
out-lit: can_lexical2string<string> : Yes
out-lit: can_convertToString<string> : Yes
out-lit: use_StringConversion4Stream<string> : No
out-lit: Type: StringPtr ......
out-lit: is_StringLike<StringPtr> : No
out-lit: BasicallyString<StringPtr> : No
out-lit: BasicallyCString<StringPtr> : No
out-lit: std::is_arithmetic<StringPtr> : No
out-lit: can_lexical2string<StringPtr> : No
out-lit: can_convertToString<StringPtr> : No
out-lit: use_StringConversion4Stream<StringPtr> : No
out-lit: Type: StringRef ......
out-lit: is_StringLike<StringRef> : Yes
out-lit: BasicallyString<StringRef> : Yes
out-lit: BasicallyCString<StringRef> : No
out-lit: std::is_arithmetic<StringRef> : No
out-lit: can_lexical2string<StringRef> : Yes
out-lit: can_convertToString<StringRef> : Yes
out-lit: use_StringConversion4Stream<StringRef> : No
out-lit: Type: StringRRef ......
out-lit: is_StringLike<StringRRef> : Yes
out-lit: BasicallyString<StringRRef> : Yes
out-lit: BasicallyCString<StringRRef> : No
out-lit: std::is_arithmetic<StringRRef> : No
out-lit: can_lexical2string<StringRRef> : Yes
out-lit: can_convertToString<StringRRef> : Yes
out-lit: use_StringConversion4Stream<StringRRef> : No
out-lit: Type: StrConstRef ......
out-lit: is_StringLike<StrConstRef> : No
out-lit: BasicallyString<StrConstRef> : No
out-lit: BasicallyCString<StrConstRef> : No
out-lit: std::is_arithmetic<StrConstRef> : No
out-lit: can_lexical2string<StrConstRef> : No
out-lit: can_convertToString<StrConstRef> : Yes
out-lit: use_StringConversion4Stream<StrConstRef> : Yes
out-lit: Type: CharLit ......
out-lit: is_StringLike<CharLit> : Yes
out-lit: BasicallyString<CharLit> : No
out-lit: BasicallyCString<CharLit> : Yes
out-lit: std::is_arithmetic<CharLit> : No
out-lit: can_lexical2string<CharLit> : Yes
out-lit: can_convertToString<CharLit> : Yes
out-lit: use_StringConversion4Stream<CharLit> : No
out-lit: Type: CharPtr ......
out-lit: is_StringLike<CharPtr> : Yes
out-lit: BasicallyString<CharPtr> : No
out-lit: BasicallyCString<CharPtr> : Yes
out-lit: std::is_arithmetic<CharPtr> : No
out-lit: can_lexical2string<CharPtr> : Yes
out-lit: can_convertToString<CharPtr> : Yes
out-lit: use_StringConversion4Stream<CharPtr> : No
out-lit: Type: Reticent ......
out-lit: is_StringLike<Reticent> : No
out-lit: BasicallyString<Reticent> : No
out-lit: BasicallyCString<Reticent> : No
out-lit: std::is_arithmetic<Reticent> : No
out-lit: can_lexical2string<Reticent> : No
out-lit: can_convertToString<Reticent> : No
out-lit: use_StringConversion4Stream<Reticent> : Yes
out-lit: Type: P<Reticent> ......
out-lit: is_StringLike<P<Reticent>> : No
out-lit: BasicallyString<P<Reticent>> : No
out-lit: BasicallyCString<P<Reticent>> : No
out-lit: std::is_arithmetic<P<Reticent>> : No
out-lit: can_lexical2string<P<Reticent>> : No
out-lit: can_convertToString<P<Reticent>> : Yes
out-lit: use_StringConversion4Stream<P<Reticent>> : Yes
out-lit: Type: GenNode ......
out-lit: is_StringLike<GenNode> : No
out-lit: BasicallyString<GenNode> : No
out-lit: BasicallyCString<GenNode> : No
out-lit: std::is_arithmetic<GenNode> : No
out-lit: can_lexical2string<GenNode> : No
out-lit: can_convertToString<GenNode> : Yes
out-lit: use_StringConversion4Stream<GenNode> : Yes
out-lit: Type: GenNodePtr ......
out-lit: is_StringLike<GenNodePtr> : No
out-lit: BasicallyString<GenNodePtr> : No
out-lit: BasicallyCString<GenNodePtr> : No
out-lit: std::is_arithmetic<GenNodePtr> : No
out-lit: can_lexical2string<GenNodePtr> : No
out-lit: can_convertToString<GenNodePtr> : No
out-lit: use_StringConversion4Stream<GenNodePtr> : No
out-lit: Type: GenNodeRef ......
out-lit: is_StringLike<GenNodeRef> : No
out-lit: BasicallyString<GenNodeRef> : No
out-lit: BasicallyCString<GenNodeRef> : No
out-lit: std::is_arithmetic<GenNodeRef> : No
out-lit: can_lexical2string<GenNodeRef> : No
out-lit: can_convertToString<GenNodeRef> : Yes
out-lit: use_StringConversion4Stream<GenNodeRef> : Yes
out-lit: Type: GenNodeRRef ......
out-lit: is_StringLike<GenNodeRRef> : No
out-lit: BasicallyString<GenNodeRRef> : No
out-lit: BasicallyCString<GenNodeRRef> : No
out-lit: std::is_arithmetic<GenNodeRRef> : No
out-lit: can_lexical2string<GenNodeRRef> : No
out-lit: can_convertToString<GenNodeRRef> : Yes
out-lit: use_StringConversion4Stream<GenNodeRRef> : Yes
out-lit: Type: P<GenNode> ......
out-lit: is_StringLike<P<GenNode>> : No
out-lit: BasicallyString<P<GenNode>> : No
out-lit: BasicallyCString<P<GenNode>> : No
out-lit: std::is_arithmetic<P<GenNode>> : No
out-lit: can_lexical2string<P<GenNode>> : No
out-lit: can_convertToString<P<GenNode>> : Yes
out-lit: use_StringConversion4Stream<P<GenNode>> : Yes
out-lit: ───────────────────────────╼━━━━━━━━━━╾───────────────────────────
out-lit: smart-ptr, no string conv...«Reticent»
out-lit: smart-ptr, custom conv......GenNode-ID("Hui")-DataCap|«string»|Buh
out-lit: reference, no string conv...«Reticent»
out-lit: reference, custom conv......GenNode-ID("Hui")-DataCap|«string»|Buh
out: pointer, custom conv......╲_....+ ↗GenNode-ID("Hui")-DataCap|«string»|Buh
out-lit: smart-ptr, NULL pointee.....⟂ P<GenNode>
out-lit: pointer, NULL pointee.....⟂ «GenNode»
return: 0
END

View file

@ -84,13 +84,23 @@ namespace test {
{
using CharLit = decltype("literal");
using CharPtr = const char*;
using StrCRef = string const&;
using GenNodePtr = GenNode*;
using GenNodeRef = GenNode&;
using StringPtr = string *;
using StringRef = string &;
using StringRRef = string &&;
using StrConstRef = string const&;
using GenNodePtr = GenNode*;
using GenNodeRef = GenNode&;
using GenNodeRRef = GenNode&&;
ANALYSE (int);
ANALYSE (char);
ANALYSE (double);
ANALYSE (int64_t);
ANALYSE (string);
ANALYSE (StrCRef);
ANALYSE (StringPtr);
ANALYSE (StringRef);
ANALYSE (StringRRef);
ANALYSE (StrConstRef);
ANALYSE (CharLit);
ANALYSE (CharPtr)
ANALYSE (Reticent)
@ -98,8 +108,9 @@ namespace test {
ANALYSE (GenNode)
ANALYSE (GenNodePtr)
ANALYSE (GenNodeRef)
ANALYSE (GenNodeRRef)
ANALYSE (P<GenNode>)
cout << endl;
cout << "───────────────────────────╼━━━━━━━━━━╾───────────────────────────"<<endl;
}
}//(end)fixture