changeset 214:08b07c6eeec7 package_refactor

Move index.jl to its own package
author Jonatan Werpers <jonatan@werpers.com>
date Wed, 26 Jun 2019 11:10:12 +0200
parents 0bf761485f40
children 3a93d8a799ce
files Manifest.toml Project.toml RegionIndices/Project.toml RegionIndices/src/RegionIndices.jl index.jl
diffstat 5 files changed, 84 insertions(+), 70 deletions(-) [+]
line wrap: on
line diff
--- a/Manifest.toml	Wed Jun 26 11:01:17 2019 +0200
+++ b/Manifest.toml	Wed Jun 26 11:10:12 2019 +0200
@@ -14,3 +14,8 @@
 path = "LazyTensors"
 uuid = "62fbed2c-918d-11e9-279b-eb3a325b37d3"
 version = "0.1.0"
+
+[[RegionIndices]]
+path = "RegionIndices"
+uuid = "5d527584-97f1-11e9-084c-4540c7ecf219"
+version = "0.1.0"
--- a/Project.toml	Wed Jun 26 11:01:17 2019 +0200
+++ b/Project.toml	Wed Jun 26 11:10:12 2019 +0200
@@ -2,3 +2,4 @@
 DiffOps = "39474f48-97ec-11e9-01fc-6ddcbe5918df"
 Grids = "960fdf28-97ed-11e9-2a74-bd90bf2fab5a"
 LazyTensors = "62fbed2c-918d-11e9-279b-eb3a325b37d3"
+RegionIndices = "5d527584-97f1-11e9-084c-4540c7ecf219"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RegionIndices/Project.toml	Wed Jun 26 11:10:12 2019 +0200
@@ -0,0 +1,4 @@
+name = "RegionIndices"
+uuid = "5d527584-97f1-11e9-084c-4540c7ecf219"
+authors = ["Jonatan Werpers <jonatan.werpers@it.uu.se>"]
+version = "0.1.0"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RegionIndices/src/RegionIndices.jl	Wed Jun 26 11:10:12 2019 +0200
@@ -0,0 +1,74 @@
+module RegionIndices
+
+abstract type Region end
+struct Interior <: Region end
+struct Lower    <: Region end
+struct Upper    <: Region end
+struct Unknown  <: Region end
+
+struct Index{R<:Region, T<:Integer}
+    i::T
+
+    Index{R,T}(i::T) where {R<:Region,T<:Integer} = new{R,T}(i)
+    Index{R}(i::T) where {R<:Region,T<:Integer} = new{R,T}(i)
+    Index(i::T, ::Type{R}) where {R<:Region,T<:Integer} = Index{R,T}(i)
+    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?
+end
+
+# Index(R::Type{<:Region}) = Index{R}
+
+## Vill kunna skriva
+## IndexTupleType(Int, (Lower, Interior))
+Index(R::Type{<:Region}, T::Type{<:Integer}) = Index{R,T}
+IndexTupleType(T::Type{<:Integer},R::NTuple{N, DataType} where N) = Tuple{Index.(R, T)...}
+
+Base.convert(::Type{T}, i::Index{R,T} where R) where T = i.i
+Base.convert(::Type{CartesianIndex}, I::NTuple{N,Index} where N) = CartesianIndex(convert.(Int, I))
+
+Base.Int(I::Index) = I.i
+
+function Index(i::Integer, boundary_width::Integer, dim_size::Integer)
+    return Index{getregion(i,boundary_width,dim_size)}(i)
+end
+
+IndexTuple(t::Vararg{Tuple{T, DataType}}) where T<:Integer = Index.(t)
+
+# TODO: Use the values of the region structs, e.g. Lower(), for the region parameter instead of the types.
+# For example the following works:
+#   (Lower(),Upper()) isa NTuple{2, Region} -> true
+#   typeof((Lower(),Upper()))               -> Tuple{Lower,Upper}
+function regionindices(gridsize::NTuple{Dim,Integer}, closuresize::Integer, region::NTuple{Dim,DataType}) where Dim
+    return regionindices(gridsize, ntuple(x->closuresize,Dim), region)
+end
+
+function regionindices(gridsize::NTuple{Dim,Integer}, closuresize::NTuple{Dim,Integer}, region::NTuple{Dim,DataType}) where Dim
+    regions = map(getrange,gridsize,closuresize,region)
+    return CartesianIndices(regions)
+end
+
+function getregion(i::Integer, boundary_width::Integer, dim_size::Integer)
+	if 0 < i <= boundary_width
+        return Lower
+    elseif boundary_width < i <= dim_size-boundary_width
+        return Interior
+    elseif dim_size-boundary_width < i <= dim_size
+        return Upper
+    else
+        error("Bounds error") # TODO: Make this more standard
+    end
+end
+
+function getrange(gridsize::Integer, closuresize::Integer, region::DataType)
+    if region == Lower
+        r = 1:closuresize
+    elseif region == Interior
+        r = (closuresize+1):(gridsize - closuresize)
+    elseif region == Upper
+        r = (gridsize - closuresize + 1):gridsize
+    else
+        error("Unspecified region")
+    end
+    return r
+end
+
+end # module
--- a/index.jl	Wed Jun 26 11:01:17 2019 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-abstract type Region end
-struct Interior <: Region end
-struct Lower    <: Region end
-struct Upper    <: Region end
-struct Unknown  <: Region end
-
-struct Index{R<:Region, T<:Integer}
-    i::T
-
-    Index{R,T}(i::T) where {R<:Region,T<:Integer} = new{R,T}(i)
-    Index{R}(i::T) where {R<:Region,T<:Integer} = new{R,T}(i)
-    Index(i::T, ::Type{R}) where {R<:Region,T<:Integer} = Index{R,T}(i)
-    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?
-end
-
-# Index(R::Type{<:Region}) = Index{R}
-
-## Vill kunna skriva
-## IndexTupleType(Int, (Lower, Interior))
-Index(R::Type{<:Region}, T::Type{<:Integer}) = Index{R,T}
-IndexTupleType(T::Type{<:Integer},R::NTuple{N, DataType} where N) = Tuple{Index.(R, T)...}
-
-Base.convert(::Type{T}, i::Index{R,T} where R) where T = i.i
-Base.convert(::Type{CartesianIndex}, I::NTuple{N,Index} where N) = CartesianIndex(convert.(Int, I))
-
-Base.Int(I::Index) = I.i
-
-function Index(i::Integer, boundary_width::Integer, dim_size::Integer)
-    return Index{getregion(i,boundary_width,dim_size)}(i)
-end
-
-IndexTuple(t::Vararg{Tuple{T, DataType}}) where T<:Integer = Index.(t)
-
-# TODO: Use the values of the region structs, e.g. Lower(), for the region parameter instead of the types.
-# For example the following works:
-#   (Lower(),Upper()) isa NTuple{2, Region} -> true
-#   typeof((Lower(),Upper()))               -> Tuple{Lower,Upper}
-function regionindices(gridsize::NTuple{Dim,Integer}, closuresize::Integer, region::NTuple{Dim,DataType}) where Dim
-    return regionindices(gridsize, ntuple(x->closuresize,Dim), region)
-end
-
-function regionindices(gridsize::NTuple{Dim,Integer}, closuresize::NTuple{Dim,Integer}, region::NTuple{Dim,DataType}) where Dim
-    regions = map(getrange,gridsize,closuresize,region)
-    return CartesianIndices(regions)
-end
-
-function getregion(i::Integer, boundary_width::Integer, dim_size::Integer)
-	if 0 < i <= boundary_width
-        return Lower
-    elseif boundary_width < i <= dim_size-boundary_width
-        return Interior
-    elseif dim_size-boundary_width < i <= dim_size
-        return Upper
-    else
-        error("Bounds error") # TODO: Make this more standard
-    end
-end
-
-function getrange(gridsize::Integer, closuresize::Integer, region::DataType)
-    if region == Lower
-        r = 1:closuresize
-    elseif region == Interior
-        r = (closuresize+1):(gridsize - closuresize)
-    elseif region == Upper
-        r = (gridsize - closuresize + 1):gridsize
-    else
-        error("Unspecified region")
-    end
-    return r
-end