Mercurial > repos > public > sbplib_julia
annotate index.jl @ 98:50273f745f05 cell_based_test
Add "Unknown" region and implement D2 for it
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Wed, 06 Feb 2019 08:58:32 +0100 |
parents | 0743e1247384 |
children | a274d6384e91 |
rev | line source |
---|---|
96
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
1 abstract type Region end |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
2 struct Interior <: Region end |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
3 struct Lower <: Region end |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
4 struct Upper <: Region end |
98
50273f745f05
Add "Unknown" region and implement D2 for it
Jonatan Werpers <jonatan@werpers.com>
parents:
96
diff
changeset
|
5 struct Unknown <: Region end |
96
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
6 |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
7 struct Index{R<:Region, T<:Integer} |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
8 i::T |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
9 |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
10 Index{R,T}(i::T) where {R<:Region,T<:Integer} = new{R,T}(i) |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
11 Index{R}(i::T) where {R<:Region,T<:Integer} = new{R,T}(i) |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
12 Index(i::T, ::Type{R}) where {R<:Region,T<:Integer} = Index{R,T}(i) |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
13 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? |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
14 end |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
15 |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
16 # Index(R::Type{<:Region}) = Index{R} |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
17 |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
18 ## Vill kunna skriva |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
19 ## IndexTupleType(Int, (Lower, Interior)) |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
20 Index(R::Type{<:Region}, T::Type{<:Integer}) = Index{R,T} |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
21 IndexTupleType(T::Type{<:Integer},R::NTuple{N, DataType} where N) = Tuple{Index.(R, T)...} |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
22 |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
23 Base.convert(::Type{T}, i::Index{R,T} where R) where T = i.i |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
24 Base.convert(::Type{CartesianIndex}, I::NTuple{N,Index} where N) = CartesianIndex(convert.(Int, I)) |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
25 |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
26 Base.Int(I::Index) = I.i |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
27 |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
28 function Index(i::Integer, boundary_width::Integer, dim_size::Integer) |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
29 if 0 < i <= boundary_width |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
30 return Index{Lower}(i) |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
31 elseif boundary_width < i <= dim_size-boundary_width |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
32 return Index{Interior}(i) |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
33 elseif dim_size-boundary_width < i <= dim_size |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
34 return Index{Upper}(i) |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
35 else |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
36 error("Bounds error") # TODO: Make this more standard |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
37 end |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
38 end |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
39 |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
40 IndexTuple(t::Vararg{Tuple{T, DataType}}) where T<:Integer = Index.(t) |