On Tuesday, 5 June 2012 at 01:01:07 UTC, Chang Long wrote:
I need a type can be change on compile time, it can be
immutable or mutable at run time.
For example :
-------------------------------------------------------------------------------
abstract class Template_parameter_Base{
TypeInto ti;
string file ;
size_t line l;
string name ;
this(TypeInto ti, string file, size_t line, string name){
this.ti = ti ;
this.file = file ;
this.line = line ;
this.name = name ;
}
}
class Template_parameter(T) : Template_parameter_Base {
T value ;
alias T this;
void assign(ref T t){
value = t ;
}
}
class Template {
static
compile_time_mutable(string[Template_parameter_Base])
template_vars ;
void assign(string name, string __file__ = __FILE__, size_t
__line__ =__LINE__, T)(T t) {
static if( name in template_vars ){
static parameter = template_vars[name] ;
} else {
static parameter = template_vars[name] = new
Template_parameter(typeid(T), __file__, __line__ );
}
parameter.assign(t);
}
string render(){
// use template_vars comiplate a dynamic link lib , and load
it, and put the template_vars to it, and run it ,
// if dynamic link lib already exists, or the templte file
is not changed, just run it .
}
}
void main(){
static tpl = new Template;
auto is_login = false ;
tpl.assign!"is_login"( is_login) ) ;
if( is_login ) {
tpl.assign!"user"( new User() ) ;
}
}
-------------------------------------------------------------------------------
Why I need this is because I need to know all parameters at
first time call Template.render, but a lot parameter will not
be call at run time. so I need a type can be changed at compile
time.
the new type is just like mutable type at CTFE.
The previous two example is not correct, please see this one:
abstract class Template_parameter_Base{
TypeInto ti;
string file ;
size_t line l;
string name ;
this(TypeInto ti, string file, size_t line, string name){
this.ti = ti ;
this.file = file ;
this.line = line ;
this.name = name ;
}
}
class Template_parameter(T) : Template_parameter_Base {
T value ;
alias T this;
void assign(ref T t){
value = t ;
}
}
class Template_Engine {
string name ;
Template_parameter_Base[string] parameters ;
void this(string name) {
this.name = name ;
}
}
class Template (string name) {
static compile_time_mutable(Template_Engine) engine = new
Template_Engine(name) ;
void assign(string name, string __file__ = __FILE__, size_t
__line__ =__LINE__, T)(T t) {
static if( name in engine.parameters ){
static compile_time_mutable(parameter) =
engine.parameters[name] ;
static assert( parameter.ti == typeid(T), "assign var at " ~
__file__ ~ " line" ~ __line__ " with type " ~ T.stringof " ~
conflict with old parameter at file " ~ parameter.file ~ " line
" ~ parameter.line );
} else {
static compile_time_mutable(parameter) =
engine.parameters[name] = new Template_parameter(typeid(T),
__file__, __line__ , name );
}
// put the value to parameter at run time
parameter.assign(t);
}
string render(){
// use the engine.parameters can know all parameter type
information
// use template_vars comiplate a dynamic link lib , and load
it, and put the template_vars to it, and run it ,
// if dynamic link lib already exists, or the templte file
is not changed, just run it .
}
}
void main(){
static tpl = new Template!"home_page" ;
auto is_login = false ;
tpl.assign!"is_login"( is_login) ) ;
if( is_login ) {
tpl.assign!"user"( new User() ) ;
}
auto string switch_user = "new_user_email" ;
if( switch_user !is null ) {
tpl.assign!"user"( new User(switch_user) ) ;
}
tpl.assign!"user"( true ) ; // static assert error
}