Skip to content

Instantly share code, notes, and snippets.

@ochafik
Created December 15, 2014 17:57
Show Gist options
  • Select an option

  • Save ochafik/879fd041e782a7f5cec6 to your computer and use it in GitHub Desktop.

Select an option

Save ochafik/879fd041e782a7f5cec6 to your computer and use it in GitHub Desktop.
opencl tuples dart
library opencl;
import 'dart:mirrors';
import 'package:quiver/iterables.dart';
import 'package:collection/equality.dart';
class Context {}
class Array<T> {
final int length;
final Context context;
Array(this.length, this.context);
}
Array<Vector2<int, IntType>> int2Array(int length, Context context) =>
new Array<Vector2<int, IntType>>(length, context);
abstract class OCLType {}
class IntType extends OCLType {}
class ShortType extends OCLType {}
class ByteType extends OCLType {}
class LongType extends OCLType {}
class FloatType extends OCLType {}
class DoubleType extends OCLType {}
abstract class Vector<T, O extends OCLType, V extends Vector<T, O, V>> {
static const _LIST_EQUALITY = const ListEquality();
List<T> get values;
V newInstance(List<T> values) =>
reflect(this).type.newInstance(const Symbol(""), values).reflectee;
@override bool operator==(V other) =>
_LIST_EQUALITY.equals(values, other.values);
V operator+(other) => _pieceWise(other, (T a, T b) => a + b);
V operator-(other) => _pieceWise(other, (T a, T b) => a - b);
V operator*(other) => _pieceWise(other, (T a, T b) => a * b);
V operator/(other) => _pieceWise(other, (T a, T b) => a is int ? (a / b).toInt() : (a / b));
V operator%(other) => _pieceWise(other, (T a, T b) => a % b);
V _pieceWise(other, T f(T a, T b)) =>
newInstance(new List<T>()..addAll(
other is Vector ?
zip([values, other.values]).map((List<T> vs) => f(vs[0], vs[1])) :
values.map((v) => f(v, other))));
@override String toString() => values.toString();
}
class Vector2<T extends num, O extends OCLType> extends
Vector<T, O, Vector2<T, O>> {
T s0, s1;
Vector2(this.s0, this.s1);
List<T> get values => [s0, s1];
T get x => s0;
set x(T x) => s0 = x;
T get y => s1;
set y(T x) => s1 = x;
}
class Vector3<T extends num, O extends OCLType> extends
Vector<T, O, Vector3<T, O>> {
T s0, s1, s2;
Vector3(this.s0, this.s1, this.s2);
List<T> get values => [s0, s1, s2];
T get x => s0;
set x(T x) => s0 = x;
T get y => s1;
set y(T x) => s1 = x;
T get z => s2;
set z(T x) => s2 = x;
}
class Vector4<T extends num, O extends OCLType> extends
Vector<T, O, Vector4<T, O>> {
T s0, s1, s2, s3;
Vector4(this.s0, this.s1, this.s2, this.s3);
List<T> get values => [s0, s1, s2, s3];
T get x => s0;
set x(T x) => s0 = x;
T get y => s1;
set y(T x) => s1 = x;
T get z => s2;
set z(T x) => s2 = x;
T get w => s3;
set w(T x) => s3 = x;
}
class Vector8<T extends num, O extends OCLType> extends
Vector<T, O, Vector8<T, O>> {
T s0, s1, s2, s3, s4, s5, s6, s7;
Vector8(this.s0, this.s1, this.s2, this.s3, this.s4, this.s5, this.s6, this.s7);
List<T> get values => [s0, s1, s2, s3, s4, s5, s6, s7];
T get x => s0;
set x(T x) => s0 = x;
T get y => s1;
set y(T x) => s1 = x;
T get z => s2;
set z(T x) => s2 = x;
T get w => s3;
set w(T x) => s3 = x;
}
class Vector16<T extends num, O extends OCLType> extends
Vector<T, O, Vector16<T, O>> {
T s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sa, sb, sc, sd, se, sf;
Vector16(this.s0, this.s1, this.s2, this.s3, this.s4, this.s5, this.s6, this.s7,
this.s8, this.s9, this.sa, this.sb, this.sc, this.sd, this.se, this.sf);
List<T> get values => [s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sa, sb, sc, sd, se, sf];
T get x => s0;
set x(T x) => s0 = x;
T get y => s1;
set y(T x) => s1 = x;
T get z => s2;
set z(T x) => s2 = x;
T get w => s3;
set w(T x) => s3 = x;
}
Vector2<int, IntType> int2(int s0, int s1) =>
new Vector2<int, IntType>(s0, s1);
Vector3<int, IntType> int3(int s0, int s1, int s2) =>
new Vector3<int, IntType>(s0, s1, s2);
Vector4<int, IntType> int4(int s0, int s1, int s2, int s3) =>
new Vector4<int, IntType>(s0, s1, s2, s3);
Vector8<int, IntType> int8(int s0, int s1, int s2, int s3, int s4, int s5, int s6, int s7) =>
new Vector8<int, IntType>(s0, s1, s2, s3, s4, s5, s6, s7);
Vector16<int, IntType> int16(int s0, int s1, int s2, int s3, int s4, int s5, int s6, int s7, int s8, int s9, int sa, int sb, int sc, int sd, int se, int sf) =>
new Vector16<int, IntType>(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sa, sb, sc, sd, se, sf);
Vector2<int, ShortType> short2(int s0, int s1) =>
new Vector2<int, ShortType>(s0, s1);
Vector3<int, ShortType> short3(int s0, int s1, int s2) =>
new Vector3<int, ShortType>(s0, s1, s2);
Vector4<int, ShortType> short4(int s0, int s1, int s2, int s3) =>
new Vector4<int, ShortType>(s0, s1, s2, s3);
Vector8<int, ShortType> short8(int s0, int s1, int s2, int s3, int s4, int s5, int s6, int s7) =>
new Vector8<int, ShortType>(s0, s1, s2, s3, s4, s5, s6, s7);
Vector16<int, ShortType> short16(int s0, int s1, int s2, int s3, int s4, int s5, int s6, int s7, int s8, int s9, int sa, int sb, int sc, int sd, int se, int sf) =>
new Vector16<int, ShortType>(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sa, sb, sc, sd, se, sf);
Vector2<int, ShortType> byte2(int s0, int s1) =>
new Vector2<int, ShortType>(s0, s1);
Vector3<int, ShortType> byte3(int s0, int s1, int s2) =>
new Vector3<int, ShortType>(s0, s1, s2);
Vector4<int, ShortType> byte4(int s0, int s1, int s2, int s3) =>
new Vector4<int, ShortType>(s0, s1, s2, s3);
Vector8<int, ShortType> byte8(int s0, int s1, int s2, int s3, int s4, int s5, int s6, int s7) =>
new Vector8<int, ShortType>(s0, s1, s2, s3, s4, s5, s6, s7);
Vector16<int, ShortType> byte16(int s0, int s1, int s2, int s3, int s4, int s5, int s6, int s7, int s8, int s9, int sa, int sb, int sc, int sd, int se, int sf) =>
new Vector16<int, ShortType>(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sa, sb, sc, sd, se, sf);
Vector2<int, ShortType> long2(int s0, int s1) =>
new Vector2<int, ShortType>(s0, s1);
Vector3<int, ShortType> long3(int s0, int s1, int s2) =>
new Vector3<int, ShortType>(s0, s1, s2);
Vector4<int, ShortType> long4(int s0, int s1, int s2, int s3) =>
new Vector4<int, ShortType>(s0, s1, s2, s3);
Vector8<int, ShortType> long8(int s0, int s1, int s2, int s3, int s4, int s5, int s6, int s7) =>
new Vector8<int, ShortType>(s0, s1, s2, s3, s4, s5, s6, s7);
Vector16<int, ShortType> long16(int s0, int s1, int s2, int s3, int s4, int s5, int s6, int s7, int s8, int s9, int sa, int sb, int sc, int sd, int se, int sf) =>
new Vector16<int, ShortType>(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sa, sb, sc, sd, se, sf);
Vector2<num, DoubleType> double2(num s0, num s1) =>
new Vector2<num, DoubleType>(s0, s1);
Vector3<num, DoubleType> double3(num s0, num s1, num s2) =>
new Vector3<num, DoubleType>(s0, s1, s2);
Vector4<num, DoubleType> double4(num s0, num s1, num s2, num s3) =>
new Vector4<num, DoubleType>(s0, s1, s2, s3);
Vector8<num, DoubleType> double8(num s0, num s1, num s2, num s3, num s4, num s5, num s6, num s7) =>
new Vector8<num, DoubleType>(s0, s1, s2, s3, s4, s5, s6, s7);
Vector16<num, DoubleType> double16(num s0, num s1, num s2, num s3, num s4, num s5, num s6, num s7, num s8, num s9, num sa, num sb, num sc, num sd, num se, num sf) =>
new Vector16<num, DoubleType>(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sa, sb, sc, sd, se, sf);
Vector2<num, FloatType> float2(num s0, num s1) =>
new Vector2<num, FloatType>(s0, s1);
Vector3<num, FloatType> float3(num s0, num s1, num s2) =>
new Vector3<num, FloatType>(s0, s1, s2);
Vector4<num, FloatType> float4(num s0, num s1, num s2, num s3) =>
new Vector4<num, FloatType>(s0, s1, s2, s3);
Vector8<num, FloatType> float8(num s0, num s1, num s2, num s3, num s4, num s5, num s6, num s7) =>
new Vector8<num, FloatType>(s0, s1, s2, s3, s4, s5, s6, s7);
Vector16<num, FloatType> float16(num s0, num s1, num s2, num s3, num s4, num s5, num s6, num s7, num s8, num s9, num sa, num sb, num sc, num sd, num se, num sf) =>
new Vector16<num, FloatType>(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sa, sb, sc, sd, se, sf);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment