Skip to content

Instantly share code, notes, and snippets.

@jrevels
Created August 12, 2016 14:10
Show Gist options
  • Save jrevels/ec3c7474a41b5c166b13633e357f0891 to your computer and use it in GitHub Desktop.
Save jrevels/ec3c7474a41b5c166b13633e357f0891 to your computer and use it in GitHub Desktop.
function tupexpr(f, N)
ex = Expr(:tuple, [f(i) for i=1:N]...)
return quote
@inbounds return $(ex)
end
end
@inline iszero_tuple(::Tuple{}) = true
@inline zero_tuple(::Type{Tuple{}}) = tuple()
@inline one_tuple(::Type{Tuple{}}) = tuple()
@inline rand_tuple(::AbstractRNG, ::Type{Tuple{}}) = tuple()
@inline rand_tuple(::Type{Tuple{}}) = tuple()
@generated iszero_tuple{N,T}(tup::NTuple{N,T}) = :(Base.@_inline_meta(); z = zero(T); @inbounds return $(Expr(:&&, [:(z == tup[$i]) for i=1:N]...)))
@generated zero_tuple{N,T}(::Type{NTuple{N,T}}) = :(Base.@_inline_meta(); z = zero(T); $(tupexpr(i -> :(z), N)))
@generated one_tuple{N,T}(::Type{NTuple{N,T}}) = :(Base.@_inline_meta(); z = one(T); $(tupexpr(i -> :(z), N)))
@generated rand_tuple{N,T}(rng::AbstractRNG, ::Type{NTuple{N,T}}) = :(Base.@_inline_meta(); $(tupexpr(i -> :(rand(rng, T)), N)))
@generated rand_tuple{N,T}(::Type{NTuple{N,T}}) = :(Base.@_inline_meta(); $(tupexpr(i -> :(rand(T)), N)))
@generated scale_tuple{N}(tup::NTuple{N}, x) = :(Base.@_inline_meta(); $(tupexpr(i -> :(tup[$i] * x), N)))
@generated div_tuple_by_scalar{N}(tup::NTuple{N}, x) = :(Base.@_inline_meta(); $(tupexpr(i -> :(tup[$i] / x), N)))
@generated add_tuples{N}(a::NTuple{N}, b::NTuple{N}) = :(Base.@_inline_meta(); $(tupexpr(i -> :(a[$i] + b[$i]), N)))
@generated sub_tuples{N}(a::NTuple{N}, b::NTuple{N}) = :(Base.@_inline_meta(); $(tupexpr(i -> :(a[$i] - b[$i]), N)))
@generated minus_tuple{N}(tup::NTuple{N}) = :(Base.@_inline_meta(); $(tupexpr(i -> :(-tup[$i]), N)))
@generated mul_tuples{N}(a::NTuple{N}, b::NTuple{N}, afactor, bfactor) = :(Base.@_inline_meta(); $(tupexpr(i -> :((afactor * a[$i]) + (bfactor * b[$i])), N)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment