Add meta.trait.Fields
This commit is contained in:
		@@ -1758,6 +1758,10 @@ template isMutable(T)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 | 
					 * Determines whether $(D_PARAM T) is a nested type, i.e. $(D_KEYWORD class),
 | 
				
			||||||
 | 
					 * $(D_KEYWORD struct) or $(D_KEYWORD union), which internally stores a context
 | 
				
			||||||
 | 
					 * pointer.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 * Params:
 | 
					 * Params:
 | 
				
			||||||
 *  T = $(D_KEYWORD class), $(D_KEYWORD struct) or $(D_KEYWORD union) type.
 | 
					 *  T = $(D_KEYWORD class), $(D_KEYWORD struct) or $(D_KEYWORD union) type.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
@@ -1788,6 +1792,8 @@ pure nothrow @safe unittest
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 | 
					 * Determines whether $(D_PARAM T) is a nested function.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 * Params:
 | 
					 * Params:
 | 
				
			||||||
 *  F = A function.
 | 
					 *  F = A function.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
@@ -1809,6 +1815,8 @@ enum bool isNestedFunction(alias F) = __traits(isNested, F);
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 | 
					 * Determines the type of the callable $(D_PARAM F).
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 * Params:
 | 
					 * Params:
 | 
				
			||||||
 *  F = A function.
 | 
					 *  F = A function.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
@@ -1898,6 +1906,8 @@ if (isCallable!F)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 | 
					 * Determines the return type of the callable $(D_PARAM F).
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 * Params:
 | 
					 * Params:
 | 
				
			||||||
 *  F = A callable object.
 | 
					 *  F = A callable object.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
@@ -3055,3 +3065,60 @@ template isInnerClass(T)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    static assert(!isInnerClass!(RefCountedStore!int));
 | 
					    static assert(!isInnerClass!(RefCountedStore!int));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Returns the types of all members of $(D_PARAM T).
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * If $(D_PARAM T) is a $(D_KEYWORD struct) or $(D_KEYWORD union) or
 | 
				
			||||||
 | 
					 * $(D_KEYWORD class), returns the types of all its fields. It is actually the
 | 
				
			||||||
 | 
					 * same as `T.tupleof`, but the content pointer for the nested type isn't
 | 
				
			||||||
 | 
					 * included.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * If $(D_PARAM T) is neither a $(D_KEYWORD struct) nor $(D_KEYWORD union) nor
 | 
				
			||||||
 | 
					 * $(D_KEYWORD class), $(D_PSYMBOL Fields) returns an $(D_PSYMBOL AliasSeq)
 | 
				
			||||||
 | 
					 * with the single element $(D_PARAM T).
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Params:
 | 
				
			||||||
 | 
					 *  T = A type.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Returns: $(D_PARAM T)'s fields.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					template Fields(T)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    static if ((is(T == struct) || is(T == union)) && isNested!T)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // The last element of .tupleof of a nested struct or union is "this",
 | 
				
			||||||
 | 
					        // the context pointer, type "void*".
 | 
				
			||||||
 | 
					        alias Fields = typeof(T.tupleof[0 .. $ - 1]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else static if (is(T == class) || is(T == struct) || is(T == union))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        alias Fields = typeof(T.tupleof);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        alias Fields = AliasSeq!T;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					@nogc nothrow pure @safe unittest
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    struct Nested
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        void func()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    static assert(is(Fields!Nested == AliasSeq!int));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class C
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        uint u;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    static assert(is(Fields!C == AliasSeq!uint));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static assert(is(Fields!short == AliasSeq!short));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user