Mercurial > repos > public > sbplib_julia
comparison src/RegionIndices/RegionIndices.jl @ 334:91e015880ae6 refactor/combine_to_one_package
Fix typo in directory name
| author | Jonatan Werpers <jonatan@werpers.com> |
|---|---|
| date | Fri, 25 Sep 2020 13:13:07 +0200 |
| parents | src/RegionInidices/RegionIndices.jl@01b851161018 |
| children | 011ca1639153 |
comparison
equal
deleted
inserted
replaced
| 333:01b851161018 | 334:91e015880ae6 |
|---|---|
| 1 module RegionIndices | |
| 2 | |
| 3 abstract type Region end | |
| 4 struct Interior <: Region end | |
| 5 struct Lower <: Region end | |
| 6 struct Upper <: Region end | |
| 7 struct Unknown <: Region end | |
| 8 | |
| 9 export Region, Interior, Lower, Upper, Unknown | |
| 10 | |
| 11 struct Index{R<:Region, T<:Integer} | |
| 12 i::T | |
| 13 | |
| 14 Index{R,T}(i::T) where {R<:Region,T<:Integer} = new{R,T}(i) | |
| 15 Index{R}(i::T) where {R<:Region,T<:Integer} = new{R,T}(i) | |
| 16 Index(i::T, ::Type{R}) where {R<:Region,T<:Integer} = Index{R,T}(i) | |
| 17 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? | |
| 18 end | |
| 19 | |
| 20 export Index | |
| 21 | |
| 22 # Index(R::Type{<:Region}) = Index{R} | |
| 23 | |
| 24 ## Vill kunna skriva | |
| 25 ## IndexTupleType(Int, (Lower, Interior)) | |
| 26 Index(R::Type{<:Region}, T::Type{<:Integer}) = Index{R,T} | |
| 27 IndexTupleType(T::Type{<:Integer},R::NTuple{N, DataType} where N) = Tuple{Index.(R, T)...} | |
| 28 | |
| 29 Base.convert(::Type{T}, i::Index{R,T} where R) where T = i.i | |
| 30 Base.convert(::Type{CartesianIndex}, I::NTuple{N,Index} where N) = CartesianIndex(convert.(Int, I)) | |
| 31 | |
| 32 Base.Int(I::Index) = I.i | |
| 33 Base.to_index(I::Index) = Int(I) #How to get this to work for all cases?? | |
| 34 Base.getindex(A::AbstractArray{T,N}, I::NTuple{N,Index}) where {T,N} = A[I...] #Is this ok?? | |
| 35 | |
| 36 function Index(i::Integer, boundary_width::Integer, dim_size::Integer) | |
| 37 return Index{getregion(i,boundary_width,dim_size)}(i) | |
| 38 end | |
| 39 | |
| 40 IndexTuple(t::Vararg{Tuple{T, DataType}}) where T<:Integer = Index.(t) | |
| 41 export IndexTuple | |
| 42 | |
| 43 # TODO: Use the values of the region structs, e.g. Lower(), for the region parameter instead of the types. | |
| 44 # For example the following works: | |
| 45 # (Lower(),Upper()) isa NTuple{2, Region} -> true | |
| 46 # typeof((Lower(),Upper())) -> Tuple{Lower,Upper} | |
| 47 function regionindices(gridsize::NTuple{Dim,Integer}, closuresize::Integer, region::NTuple{Dim,DataType}) where Dim | |
| 48 return regionindices(gridsize, ntuple(x->closuresize,Dim), region) | |
| 49 end | |
| 50 | |
| 51 function regionindices(gridsize::NTuple{Dim,Integer}, closuresize::NTuple{Dim,Integer}, region::NTuple{Dim,DataType}) where Dim | |
| 52 regions = map(getrange,gridsize,closuresize,region) | |
| 53 return CartesianIndices(regions) | |
| 54 end | |
| 55 | |
| 56 export regionindices | |
| 57 | |
| 58 function getregion(i::Integer, boundary_width::Integer, dim_size::Integer) | |
| 59 if 0 < i <= boundary_width | |
| 60 return Lower | |
| 61 elseif boundary_width < i <= dim_size-boundary_width | |
| 62 return Interior | |
| 63 elseif dim_size-boundary_width < i <= dim_size | |
| 64 return Upper | |
| 65 else | |
| 66 error("Bounds error") # TODO: Make this more standard | |
| 67 end | |
| 68 end | |
| 69 | |
| 70 export getregion | |
| 71 | |
| 72 function getrange(gridsize::Integer, closuresize::Integer, region::DataType) | |
| 73 if region == Lower | |
| 74 r = 1:closuresize | |
| 75 elseif region == Interior | |
| 76 r = (closuresize+1):(gridsize - closuresize) | |
| 77 elseif region == Upper | |
| 78 r = (gridsize - closuresize + 1):gridsize | |
| 79 else | |
| 80 error("Unspecified region") | |
| 81 end | |
| 82 return r | |
| 83 end | |
| 84 | |
| 85 end # module |
