Advertisement
Guest User

Untitled

a guest
Jan 18th, 2020
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
D 5.41 KB | None | 0 0
  1. struct mypointer(size_t size){
  2.     ubyte* point;
  3.     static if(size==0){
  4.         ubyte subbyte;
  5.        
  6.         struct bool_{
  7.             import std.bitmanip;
  8.             mixin(bitfields!(
  9.                 bool,"b1",1,
  10.                 bool,"b2",1,
  11.                 bool,"b3",1,
  12.                 bool,"b4",1,
  13.                
  14.                 bool,"b5",1,
  15.                 bool,"b6",1,
  16.                 bool,"b7",1,
  17.                 bool,"b8",1));
  18.         }
  19.        
  20.     }
  21.     void opUnary(string op:"++")(){
  22.         point+=size;
  23.         static if(size==0){
  24.             if (subbyte == 8) {point++; subbyte=1;}
  25.             else {subbyte++;}
  26.         }
  27.     }
  28.     void opUnary(string op:"--")(){
  29.         point-=size;
  30.         static if(size==0){
  31.             if (subbyte == 1) {point--; subbyte=8;}
  32.             else {subbyte--;}
  33.         }
  34.     }
  35.     void set(T)(T foo){
  36.         static if(size==0){
  37.             import std.conv;
  38.             string c(string s,int x){
  39.                 return s~"case "~x.to!string~": (cast(bool_*)point).b"~x.to!string~" =foo; break;";}
  40.             switch(subbyte){
  41.                 mixin( c(c(c(c( c(c(c(c("",1),2),3),4),5),6),7),8)
  42.                     ~"default: assert(false);");}
  43.         }
  44.         else{
  45.             *cast(T*)point=foo;}
  46.     }
  47.     T get(T)(){
  48.         static if(size==0){
  49.             import std.conv;
  50.             string c(string s,int x){
  51.                 return s~"case "~x.to!string~": return (cast(bool_*)point).b"~x.to!string~"; break;";}
  52.             switch(subbyte){
  53.                 mixin( c(c(c(c( c(c(c(c("",1),2),3),4),5),6),7),8)
  54.                     ~"default: assert(false);");}
  55.         }
  56.         else{
  57.             return *cast(T*)(cast(void*)point);}
  58.     }
  59. }
  60.  
  61. struct voidarray(size_t size, size_t count){
  62.     static if(size==0){
  63.         static if(((count/8)*8)==count){enum count_=count/8;}
  64.         else {enum count_=count/8+1;}
  65.         ubyte[count_] array;
  66.     }
  67.     else {ubyte[count*size] array;}
  68.     mypointer!size opIndex(size_t i){
  69.         static if(size==0){ return mypointer!(0)(&(array.ptr[i/8]),i%8+1);}
  70.         else {return mypointer!(size)(&(array.ptr[i*size]));}
  71.     }
  72. }
  73.  
  74. //------------
  75.  
  76. mixin template toy(T, string foo_, string bar_){
  77.     unittest{
  78.         import std.stdio;
  79.         import std.random;
  80.         import std.conv;
  81.         enum N= 1000;//uniform(100,1000);
  82.         bool[N] bools;
  83.         mixin("T foo=T("~foo_~");");
  84.         mixin("T bar=T("~bar_~");");
  85.         static if(is(T==bool)){enum size_=0;}
  86.         else {enum size_ = T.sizeof;}
  87.         voidarray!(size_,N) array;
  88.         for(int i=0; i<N/2; i++){
  89.             bools[uniform(0,N)]=true;}
  90.         writeln("starting unittest for ",T.stringof," with values: ",foo.to!string
  91.                 ,", ",bar.to!string,". An array count of ", N.to!string,", T size of ",
  92.                 T.sizeof.to!string," lazy math says: ",(N*T.sizeof).to!string,
  93.                 " actaul is: ", typeof(array).sizeof.to!string
  94.         );
  95.         int errors;
  96.         void assert_(T a, T b){
  97.             if(a!=b){errors+=1;writeln("        ",a.to!string,"!=",b.to!string);}}
  98.        
  99.         for(int i=0; i<N; i++){
  100.             if (bools[i]){array[i].set(foo);}
  101.             else{array[i].set(bar);}
  102.         }
  103.         for({mypointer!(size_) i= array[0]; int j=0;} i!=array[N]; i++, j++) {
  104.             if(bools[j]){assert_(i.get!T, foo);}
  105.             else{ assert_(i.get!T,bar);}
  106.         }
  107.         writeln("    test one, write by array, read by pointers loop: ", errors.to!string," errors");
  108.         for({mypointer!(size_) i = array[0]; bool j;} i!=array[N]; i++, j=!j) {
  109.             if(j){i.set(foo);}
  110.             else{i.set(bar);}
  111.         }
  112.         for({int i=0; bool j;} i<N; i++,j=!j){
  113.             if(j){assert_(array[i].get!T,foo);}
  114.             else{assert_(array[i].get!T,bar);}
  115.         }
  116.         writeln("    test two, write by pointer, read by array loop: ", errors.to!string, " errors");
  117.        
  118.         mypointer!size_ even(){
  119.             int i= uniform(10,N);
  120.             auto p=array[i];
  121.             if(i%2==1){p++;}
  122.             return p;
  123.         }
  124.         mypointer!size_ odd(){
  125.             auto p=even;
  126.             ++p;
  127.             return p;
  128.         }
  129.         mypointer!size_ small(){
  130.             return array[uniform(0,10)];}
  131.        
  132.         static if(__traits(compiles,array[0].set(even.get!T+even.get!T))){
  133.             {
  134.                 T foobar=cast(T)(foo+foo);
  135.                 for(int i=0; i<20;i++){
  136.                     auto x=small;
  137.                     x.set(odd.get!T+odd.get!T);
  138.                     assert_(x.get!T,foobar);
  139.                 }
  140.                 writeln("    test:",foo_,"+",foo_,"=",foobar," : ", errors.to!string, " errors");
  141.             }
  142.             {
  143.                 T foobar= cast(T)(foo+bar);
  144.                 for(int i=0; i<20;i++){
  145.                     auto x=small;
  146.                     x.set(odd.get!T+even.get!T);
  147.                     assert_(x.get!T,foobar);
  148.                 }
  149.                 writeln("    test:",foo_,"+",bar_,"=",foobar," : ", errors.to!string, " errors");
  150.             }
  151.             {
  152.                 T foobar= cast(T)(bar+foo);
  153.                 for(int i=0; i<20;i++){
  154.                     auto x=small;
  155.                     x.set(even.get!T+odd.get!T);
  156.                     assert_(x.get!T,foobar);
  157.                 }
  158.                 writeln("    test:",bar_,"+",foo_,"=",foobar," : ", errors.to!string, " errors");
  159.             }
  160.             {
  161.                 T foobar= cast(T)(bar+bar);
  162.                 for(int i=0; i<200;i++){
  163.                     auto x=small;
  164.                     x.set(even.get!T+even.get!T);
  165.                     assert_(x.get!T,foobar);
  166.                 }
  167.                 writeln("    test:",bar_,"+",bar_,"=",foobar," : ", errors.to!string, " errors");
  168.             }
  169.         }
  170.         else{ writeln("    ADDITION TESTS DIDNT RUN: ",T.stringof);}
  171. }}
  172.  
  173. mixin toy!(int,"1","2");
  174. mixin toy!(bool,"true","false");
  175. mixin toy!(float,"1.23","4.20");
  176.  
  177. mixin toy!(double,"1.234567","4.206969");
  178.  
  179. union intfloat{
  180.     int i;
  181.     float f;
  182. }
  183. mixin toy!(intfloat,"1","2");
  184. struct myint{
  185.     int i;
  186. }
  187. mixin toy!(myint,"1","2");
  188. struct myints{
  189.     int[20] i;
  190.     this(int foo){i[0]=foo;}
  191. }
  192. mixin toy!(myints,"1","2");
  193.  
  194. struct mybrokenint{
  195.     int i;
  196.     mybrokenint opBinary(string op:"+")(mybrokenint foo){
  197.         return mybrokenint(i-foo.i);}
  198. }
  199. mixin toy!(mybrokenint,"1","2");
  200.  
  201. union fint{
  202.     float f;
  203.     int i;
  204.     this(int foo){i=foo*100;}
  205.     this(float foo){f=foo;}
  206.     fint opBinary(string op:"+")(fint foo){
  207.         return fint(i+foo.f);}
  208.     string toString(){
  209.         import std.conv;
  210.         return "("~i.to!string~","~f.to!string~") ";
  211. }}
  212. mixin toy!(fint,"1","4.20");
  213.  
  214. //mixin toy!(short,"100","200");// -__-" all setters will need a cast to T
  215. void main(){}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement