Changeset 1dd929e


Ignore:
Timestamp:
Nov 29, 2019, 10:43:18 AM (5 years ago)
Author:
Dmitry Kobets <dkobets@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
0dedf756
Parents:
9ec35db
Message:

Apply traits to each individual function of vector

Previously, vector had a single trait applied to all methods. However,
it was discovered that different types (i.e., int vs float) supported different
operations (int does not support the length operation)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/vec/vec2.hfa

    r9ec35db r1dd929e  
    33#include <iostream.hfa>
    44
    5 trait vec2_t(otype T) {
     5trait zeroassn(otype T) {
     6    T ?=?(T&, zero_t);
     7};
     8trait fromint(otype T) {
    69    void ?{}(T&, int);
     10};
     11trait zero_assign(otype T) {
    712    T ?=?(T&, zero_t);
     13};
     14trait subtract(otype T) {
    815    T ?-?(T, T);
    916    T -?(T);
     17};
     18trait add(otype T) {
    1019    T ?+?(T, T);
     20};
     21trait multiply(otype T) {
    1122    T ?*?(T, T);
     23};
     24trait divide(otype T) {
    1225    T ?/?(T, T);
     26};
     27trait lessthan(otype T) {
     28    int ?<?(T, T);
     29};
     30trait equality(otype T) {
    1331    int ?==?(T, T);
    14     int ?<?(T, T);
     32};
     33trait sqrt(otype T) {
    1534    T sqrt(T);
    1635};
     
    3150}
    3251
    33 forall(otype T | vec2_t(T)) {
     52forall(otype T) {
    3453    struct vec2 {
    3554        T x, y;
     
    3756}
    3857
    39 /* static inline { */
    40 forall(otype T | vec2_t(T)) {
     58forall(otype T) {
    4159    static inline {
    4260
     
    4664        v.[x, y] = [x, y];
    4765    }
     66
     67    forall(| zero_assign(T))
    4868    void ?{}(vec2(T)& vec, zero_t) with (vec) {
    4969        x = y = 0;
    5070    }
     71
    5172    void ?{}(vec2(T)& vec, T val) with (vec) {
    5273        x = y = val;
    5374    }
     75
    5476    void ?{}(vec2(T)& vec, vec2(T) other) with (vec) {
    5577        [x,y] = other.[x,y];
     
    6082        [x,y] = other.[x,y];
    6183    }
     84    forall(| zero_assign(T))
    6285    void ?=?(vec2(T)& vec, zero_t) with (vec) {
    6386        x = y = 0;
     
    6790
    6891    // Subtraction
     92
     93    forall(| subtract(T)) {
    6994    vec2(T) ?-?(vec2(T) u, vec2(T) v) { // TODO( can't make this const ref )
    7095        return [u.x - v.x, u.y - v.y];
     
    77102        return [-x, -y];
    78103    }
     104    }
    79105
    80106    // Addition
     107    forall(| add(T)) {
    81108    vec2(T) ?+?(vec2(T) u, vec2(T) v) { // TODO( can't make this const ref )
    82109        return [u.x + v.x, u.y + v.y];
     
    86113        return u;
    87114    }
     115    }
    88116
    89117    // Scalar Multiplication
     118    forall(| multiply(T)) {
    90119    vec2(T) ?*?(vec2(T) v, T scalar) with (v) { // TODO (can't make this const ref)
    91120        return [x * scalar, y * scalar];
     
    98127        return v;
    99128    }
    100 
     129    }
    101130
    102131    // Scalar Division
     132    forall(| divide(T)) {
    103133    vec2(T) ?/?(vec2(T) v, T scalar) with (v) {
    104134        return [x / scalar, y / scalar];
     
    108138        return v;
    109139    }
     140    }
     141
    110142    // Relational Operators
     143    forall(| equality(T)) {
    111144    bool ?==?(vec2(T) u, vec2(T) v) with (u) {
    112145        return x == v.x && y == v.y;
     
    115148        return !(u == v);
    116149    }
    117 
     150    }
     151
     152    forall(| add(T) | multiply(T))
    118153    T dot(vec2(T) u, vec2(T) v) {
    119154        return u.x * v.x + u.y * v.y;
    120155    }
    121156
     157    forall(| sqrt(T) | add(T) | multiply(T))
    122158    T length(vec2(T) v) {
    123159       return sqrt(dot(v, v));
    124160    }
    125161
     162    forall(| add(T) | multiply(T))
    126163    T length_squared(vec2(T) v) {
    127164       return dot(v, v);
    128165    }
    129166
     167    forall(| subtract(T) | sqrt(T) | add(T) | multiply(T))
    130168    T distance(vec2(T) v1, vec2(T) v2) {
    131169        return length(v1 - v2);
    132170    }
    133171
     172    forall(| sqrt(T) | divide(T) | add(T) | multiply(T))
    134173    vec2(T) normalize(vec2(T) v) {
    135174        return v / sqrt(dot(v, v));
     
    137176
    138177    // Project vector u onto vector v
     178    forall(| sqrt(T) | divide(T) | add(T) | multiply(T))
    139179    vec2(T) project(vec2(T) u, vec2(T) v) {
    140180        vec2(T) v_norm = normalize(v);
     
    143183
    144184    // Reflect incident vector v with respect to surface with normal n
     185    forall(| sqrt(T) | divide(T) | add(T) | multiply(T) | subtract(T) | fromint(T))
    145186    vec2(T) reflect(vec2(T) v, vec2(T) n) {
    146187        return v - (T){2} * project(v, n);
     
    151192    // entering material (i.e., from air to water, eta = 1/1.33)
    152193    // v and n must already be normalized
     194    forall(| sqrt(T) | add(T) | multiply(T) | subtract(T) | fromint(T) | lessthan(T) | zeroassn(T))
    153195    vec2(T) refract(vec2(T) v, vec2(T) n, T eta) {
    154196        T dotValue = dot(n, v);
     
    166208    // i is the incident vector
    167209    // ng is the geometric normal of the surface
     210    forall(| add(T) | multiply(T) | lessthan(T) | fromint(T) | subtract(T))
    168211    vec2(T) faceforward(vec2(T) n, vec2(T) i, vec2(T) ng) {
    169212        return dot(ng, i) < (T){0} ? n : -n;
    170213    }
     214
    171215    }
    172216}
Note: See TracChangeset for help on using the changeset viewer.