comparison index.jl @ 134:79699dda29be

Merge in cell_based_test
author Jonatan Werpers <jonatan@werpers.com>
date Thu, 21 Feb 2019 16:27:28 +0100
parents 5df4ccb19476
children ce56727e4232
comparison
equal deleted inserted replaced
84:48079bd39969 134:79699dda29be
1 abstract type Region end
2 struct Interior <: Region end
3 struct Lower <: Region end
4 struct Upper <: Region end
5 struct Unknown <: Region end
6
7 struct Index{R<:Region, T<:Integer}
8 i::T
9
10 Index{R,T}(i::T) where {R<:Region,T<:Integer} = new{R,T}(i)
11 Index{R}(i::T) where {R<:Region,T<:Integer} = new{R,T}(i)
12 Index(i::T, ::Type{R}) where {R<:Region,T<:Integer} = Index{R,T}(i)
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?
14 end
15
16 # Index(R::Type{<:Region}) = Index{R}
17
18 ## Vill kunna skriva
19 ## IndexTupleType(Int, (Lower, Interior))
20 Index(R::Type{<:Region}, T::Type{<:Integer}) = Index{R,T}
21 IndexTupleType(T::Type{<:Integer},R::NTuple{N, DataType} where N) = Tuple{Index.(R, T)...}
22
23 Base.convert(::Type{T}, i::Index{R,T} where R) where T = i.i
24 Base.convert(::Type{CartesianIndex}, I::NTuple{N,Index} where N) = CartesianIndex(convert.(Int, I))
25
26 Base.Int(I::Index) = I.i
27
28 function Index(i::Integer, boundary_width::Integer, dim_size::Integer)
29 if 0 < i <= boundary_width
30 return Index{Lower}(i)
31 elseif boundary_width < i <= dim_size-boundary_width
32 return Index{Interior}(i)
33 elseif dim_size-boundary_width < i <= dim_size
34 return Index{Upper}(i)
35 else
36 error("Bounds error") # TODO: Make this more standard
37 end
38 end
39
40 IndexTuple(t::Vararg{Tuple{T, DataType}}) where T<:Integer = Index.(t)
41
42 function regionindices(gridsize::NTuple{Dim,Integer}, closuresize::Integer, region::NTuple{Dim,DataType}) where Dim
43 return regionindices(gridsize, ntuple(x->closuresize,Dim), region)
44 end
45
46 function regionindices(gridsize::NTuple{Dim,Integer}, closuresize::NTuple{Dim,Integer}, region::NTuple{Dim,DataType}) where Dim
47 regions = map(getrange,gridsize,closuresize,region)
48 return CartesianIndices(regions)
49 end
50
51 function getrange(gridsize::Integer, closuresize::Integer, region::DataType)
52 if region == Lower
53 r = 1:closuresize
54 elseif region == Interior
55 r = (closuresize+1):(gridsize - closuresize)
56 elseif region == Upper
57 r = (gridsize - closuresize + 1):gridsize
58 else
59 error("Unspecified region")
60 end
61 return r
62 end