Mercurial > repos > public > sbplib_julia
comparison index.jl @ 96:0743e1247384 cell_based_test
Add Index type for keeping track of regions
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Tue, 05 Feb 2019 14:57:02 +0100 |
parents | |
children | 50273f745f05 |
comparison
equal
deleted
inserted
replaced
95:9d53ecca34f7 | 96:0743e1247384 |
---|---|
1 abstract type Region end | |
2 struct Interior <: Region end | |
3 struct Lower <: Region end | |
4 struct Upper <: Region end | |
5 | |
6 struct Index{R<:Region, T<:Integer} | |
7 i::T | |
8 | |
9 Index{R,T}(i::T) where {R<:Region,T<:Integer} = new{R,T}(i) | |
10 Index{R}(i::T) where {R<:Region,T<:Integer} = new{R,T}(i) | |
11 Index(i::T, ::Type{R}) where {R<:Region,T<:Integer} = Index{R,T}(i) | |
12 Index(t::Tuple{T, DataType}) where {R<:Region,T<:Integer} = Index{t[2],T}(t[1]) # TBD: This is not very specific in what types are allowed in t[2]. Can this be fixed? | |
13 end | |
14 | |
15 # Index(R::Type{<:Region}) = Index{R} | |
16 | |
17 ## Vill kunna skriva | |
18 ## IndexTupleType(Int, (Lower, Interior)) | |
19 Index(R::Type{<:Region}, T::Type{<:Integer}) = Index{R,T} | |
20 IndexTupleType(T::Type{<:Integer},R::NTuple{N, DataType} where N) = Tuple{Index.(R, T)...} | |
21 | |
22 Base.convert(::Type{T}, i::Index{R,T} where R) where T = i.i | |
23 Base.convert(::Type{CartesianIndex}, I::NTuple{N,Index} where N) = CartesianIndex(convert.(Int, I)) | |
24 | |
25 Base.Int(I::Index) = I.i | |
26 | |
27 function Index(i::Integer, boundary_width::Integer, dim_size::Integer) | |
28 if 0 < i <= boundary_width | |
29 return Index{Lower}(i) | |
30 elseif boundary_width < i <= dim_size-boundary_width | |
31 return Index{Interior}(i) | |
32 elseif dim_size-boundary_width < i <= dim_size | |
33 return Index{Upper}(i) | |
34 else | |
35 error("Bounds error") # TODO: Make this more standard | |
36 end | |
37 end | |
38 | |
39 IndexTuple(t::Vararg{Tuple{T, DataType}}) where T<:Integer = Index.(t) |