-
Notifications
You must be signed in to change notification settings - Fork 22
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
implement and document getfields #54
Changes from 8 commits
7d90f50
22fc7c7
91ba22c
a0082e4
1b12fc8
1c88ff8
4e13aeb
191b1d3
c769603
aed4cf3
8cc0f98
1b3ed8f
2b1222f
96807ee
0d1f5c1
27de07f
bf80a50
3fe9b78
e712a31
7825e81
cd06f8c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,89 +1,149 @@ | ||
# This file is machine-generated - editing it directly is not advised | ||
|
||
[[Base64]] | ||
julia_version = "1.7.0" | ||
manifest_format = "2.0" | ||
|
||
[[deps.ANSIColoredPrinters]] | ||
git-tree-sha1 = "574baf8110975760d391c710b6341da1afa48d8c" | ||
uuid = "a4c015fc-c6ff-483c-b24f-f7ea428134e9" | ||
version = "0.0.1" | ||
|
||
[[deps.Artifacts]] | ||
uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" | ||
|
||
[[deps.Base64]] | ||
uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" | ||
|
||
[[Dates]] | ||
[[deps.CompilerSupportLibraries_jll]] | ||
deps = ["Artifacts", "Libdl"] | ||
uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" | ||
|
||
[[deps.ConstructionBase]] | ||
deps = ["LinearAlgebra"] | ||
path = ".." | ||
uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" | ||
version = "1.3.0" | ||
|
||
[[deps.Dates]] | ||
deps = ["Printf"] | ||
uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" | ||
|
||
[[Distributed]] | ||
deps = ["Random", "Serialization", "Sockets"] | ||
uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" | ||
|
||
[[DocStringExtensions]] | ||
deps = ["LibGit2", "Markdown", "Pkg", "Test"] | ||
git-tree-sha1 = "0513f1a8991e9d83255e0140aace0d0fc4486600" | ||
[[deps.DocStringExtensions]] | ||
deps = ["LibGit2"] | ||
git-tree-sha1 = "b19534d1895d702889b219c382a6e18010797f0b" | ||
uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" | ||
version = "0.8.0" | ||
version = "0.8.6" | ||
|
||
[[Documenter]] | ||
deps = ["Base64", "DocStringExtensions", "InteractiveUtils", "JSON", "LibGit2", "Logging", "Markdown", "REPL", "Test", "Unicode"] | ||
git-tree-sha1 = "1b6ae3796f60311e39cd1770566140d2c056e87f" | ||
[[deps.Documenter]] | ||
deps = ["ANSIColoredPrinters", "Base64", "Dates", "DocStringExtensions", "IOCapture", "InteractiveUtils", "JSON", "LibGit2", "Logging", "Markdown", "REPL", "Test", "Unicode"] | ||
git-tree-sha1 = "7d9a46421aef53cbd6b8ecc40c3dcbacbceaf40e" | ||
uuid = "e30172f5-a6a5-5a46-863b-614d45cd2de4" | ||
version = "0.23.3" | ||
version = "0.27.15" | ||
|
||
[[deps.Future]] | ||
deps = ["Random"] | ||
uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" | ||
|
||
[[InteractiveUtils]] | ||
[[deps.IOCapture]] | ||
deps = ["Logging", "Random"] | ||
git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" | ||
uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" | ||
version = "0.2.2" | ||
|
||
[[deps.InteractiveUtils]] | ||
deps = ["Markdown"] | ||
uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" | ||
|
||
[[JSON]] | ||
[[deps.JSON]] | ||
deps = ["Dates", "Mmap", "Parsers", "Unicode"] | ||
git-tree-sha1 = "b34d7cef7b337321e97d22242c3c2b91f476748e" | ||
git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" | ||
uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" | ||
version = "0.21.0" | ||
version = "0.21.3" | ||
|
||
[[LibGit2]] | ||
[[deps.LibGit2]] | ||
deps = ["Base64", "NetworkOptions", "Printf", "SHA"] | ||
uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" | ||
|
||
[[Logging]] | ||
[[deps.Libdl]] | ||
uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" | ||
|
||
[[deps.LinearAlgebra]] | ||
deps = ["Libdl", "libblastrampoline_jll"] | ||
uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" | ||
|
||
[[deps.Logging]] | ||
uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" | ||
|
||
[[Markdown]] | ||
[[deps.MacroTools]] | ||
deps = ["Markdown", "Random"] | ||
git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf" | ||
uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" | ||
version = "0.5.9" | ||
|
||
[[deps.Markdown]] | ||
deps = ["Base64"] | ||
uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" | ||
|
||
[[Mmap]] | ||
[[deps.Mmap]] | ||
uuid = "a63ad114-7e13-5084-954f-fe012c677804" | ||
|
||
[[Parsers]] | ||
deps = ["Dates", "Test"] | ||
git-tree-sha1 = "ef0af6c8601db18c282d092ccbd2f01f3f0cd70b" | ||
uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" | ||
version = "0.3.7" | ||
[[deps.NetworkOptions]] | ||
uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" | ||
|
||
[[deps.OpenBLAS_jll]] | ||
deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] | ||
uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" | ||
|
||
[[Pkg]] | ||
deps = ["Dates", "LibGit2", "Markdown", "Printf", "REPL", "Random", "SHA", "UUIDs"] | ||
uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" | ||
[[deps.Parsers]] | ||
deps = ["Dates"] | ||
git-tree-sha1 = "85b5da0fa43588c75bb1ff986493443f821c70b7" | ||
uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" | ||
version = "2.2.3" | ||
|
||
[[Printf]] | ||
[[deps.Printf]] | ||
deps = ["Unicode"] | ||
uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" | ||
|
||
[[REPL]] | ||
deps = ["InteractiveUtils", "Markdown", "Sockets"] | ||
[[deps.REPL]] | ||
deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] | ||
uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" | ||
|
||
[[Random]] | ||
deps = ["Serialization"] | ||
[[deps.Random]] | ||
deps = ["SHA", "Serialization"] | ||
uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" | ||
|
||
[[SHA]] | ||
[[deps.Requires]] | ||
deps = ["UUIDs"] | ||
git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" | ||
uuid = "ae029012-a4dd-5104-9daa-d747884805df" | ||
version = "1.3.0" | ||
|
||
[[deps.SHA]] | ||
uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" | ||
|
||
[[Serialization]] | ||
[[deps.Serialization]] | ||
uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" | ||
|
||
[[Sockets]] | ||
[[deps.Setfield]] | ||
deps = ["ConstructionBase", "Future", "MacroTools", "Requires"] | ||
git-tree-sha1 = "38d88503f695eb0301479bc9b0d4320b378bafe5" | ||
uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" | ||
version = "0.8.2" | ||
|
||
[[deps.Sockets]] | ||
uuid = "6462fe0b-24de-5631-8697-dd941f90decc" | ||
|
||
[[Test]] | ||
deps = ["Distributed", "InteractiveUtils", "Logging", "Random"] | ||
[[deps.Test]] | ||
deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] | ||
uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" | ||
|
||
[[UUIDs]] | ||
[[deps.UUIDs]] | ||
deps = ["Random", "SHA"] | ||
uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" | ||
|
||
[[Unicode]] | ||
[[deps.Unicode]] | ||
uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" | ||
|
||
[[deps.libblastrampoline_jll]] | ||
deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] | ||
uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
[deps] | ||
ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" | ||
Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" | ||
Setfield = "efcf1570-3423-57d1-acb7-fd33fddbac46" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
getfields(obj) -> Tuple | ||
|
||
Return a tuple containing field values of `obj`. | ||
|
||
# Examples | ||
```jldoctest | ||
julia> using ConstructionBase | ||
|
||
julia> struct S{A,B} | ||
a::A | ||
b::B | ||
end | ||
|
||
julia> getfields(S(1,2)) | ||
(1, 2) | ||
|
||
julia> getfields((a=10,b=20)) | ||
(10, 20) | ||
|
||
julia> getfields((4,5,6)) | ||
(4, 5, 6) | ||
``` | ||
|
||
# Specification | ||
|
||
Semantically `getfields` boils down to `getfield` and `fieldcount`: | ||
```julia | ||
getfields(obj) == Tuple(getfield(obj,i) for i in 1:fieldcount(obj)) | ||
``` | ||
|
||
# Implementation | ||
|
||
The semantics of `getfields` should generally not be changed. It should equivalent to | ||
```julia | ||
Tuple(getfield(obj,i) for i in 1:fieldcount(obj)) | ||
``` | ||
even if that includes private fields of `obj`. | ||
See also [`getproperties`](@ref), [`constructorof`](@ref) |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -35,6 +35,7 @@ end | |
function tridiagonal_constructor(dl::V, d::V, du::V, du2::V) where {V<:AbstractVector{T}} where T | ||
Tridiagonal{T,V}(dl, d, du, du2) | ||
end | ||
getfields(o::Tridiagonal) = Tuple(getproperties(o)) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Shouldn't we swap these? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. So you think |
||
|
||
# `du2` may be undefined, so we need a custom `getproperties` that checks `isdefined` | ||
function getproperties(o::Tridiagonal) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shouldn't this still be
getproperties
? I'm a little confused about how this is going to work. We havegetproperties
methods that let us ignoreundefined
fields and provide multipleconstructorof
implementations depending on the number of fields.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The idea was, that
constructorof
should accept all private + public fields. Additional methods are optional. But maybe that is a bad idea?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The problem is accessing undefined fields is an error, and they exist in a few Base objects. But we can special case
getfields
instead ofgetoroperties
to check if fields are defined?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can not have undefined fields in user defined types right? So we could take care of all builtin types that have these?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, I think we could special case in
getfields
for undefined fields for Base objects.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There are some objects like that here that currently use
getproperties