<font size=2 face="sans-serif">One factor is whether you consider the
version to be discrete values or a structured format for data - I'd argue
that we have a structured format due to the expectation that future versions
of the HTTP spec could arrive.</font>
<br>
<br><font size=2 face="sans-serif">Adding conformance to Hashable/Equatable
and CustomStringConvertible provides the operations, and whilst it may
look strange we could also provide convenience constants if it makes sense,
ie:</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; public static let http1_0
= HTTPVersion(major: 1, minor: 0)</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; public static let http1_1
= HTTPVersion(major: 1, minor: 1)</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; public static let http2_0
= HTTPVersion(major: 2, minor: 0)<br>
</font>
<br><font size=2 face="sans-serif">Having said that, there is slight additional
storage overhead for structs vs. enums, as a slight additional compare
cost.</font>
<br>
<br><font size=2 face="sans-serif">Chris</font>
<br>
<br><tt><font size=2>Michael Chiu &lt;hatsuneyuji@icloud.com&gt; wrote
on 14/06/2017 08:12:35:<br>
<br>
&gt; From: Michael Chiu &lt;hatsuneyuji@icloud.com&gt;</font></tt>
<br><tt><font size=2>&gt; To: Rien &lt;Rien@Balancingrock.nl&gt;</font></tt>
<br><tt><font size=2>&gt; Cc: Chris Bailey &lt;BAILEYC@uk.ibm.com&gt;,
swift-server-dev@swift.org</font></tt>
<br><tt><font size=2>&gt; Date: 14/06/2017 08:12</font></tt>
<br><tt><font size=2>&gt; Subject: Re: [swift-server-dev] Convert HTTPVersion
to struct</font></tt>
<br><tt><font size=2>&gt; <br>
&gt; I think currently the http version is come from the http_parser <br>
&gt; which has parsed the version string to number anyway. hence the <br>
&gt; performance should be similar.<br>
&gt; <br>
&gt; I do see some advantage to use struct tho, for example comparing <br>
&gt; only major version.<br>
&gt; <br>
&gt; Michael<br>
&gt; <br>
&gt; &gt; On Jun 13, 2017, at 11:41 PM, Rien via swift-server-dev &lt;swift-<br>
&gt; server-dev@swift.org&gt; wrote:<br>
&gt; &gt; <br>
&gt; &gt; The choices seem to be:<br>
&gt; &gt; <br>
&gt; &gt; 1) String<br>
&gt; &gt; 2) Enum<br>
&gt; &gt; 3) Tuple<br>
&gt; &gt; 4) Struct<br>
&gt; &gt; 5) Class<br>
&gt; &gt; <br>
&gt; &gt; 1) String<br>
&gt; &gt; Advantage: it is in fact an utf-8 string. No conversions needed.<br>
&gt; &gt; Disadvantage: It is mostly thought of as a number, thus the <br>
&gt; abstraction does not match the type, very minor performance penalty
<br>
&gt; in comparing. Illogical to add HTTP-version extensions to the type.<br>
&gt; &gt; <br>
&gt; &gt; 2) Enum<br>
&gt; &gt; Advantage: shortest possible representation (?), fastest compare
<br>
&gt; (?), easy to use.<br>
&gt; &gt; Disadvantage: Needs converting to and from.<br>
&gt; &gt; <br>
&gt; &gt; 3) Tuple<br>
&gt; &gt; Advantage: Matches fairly wel with the abstraction.<br>
&gt; &gt; Disadvantage: Fairly complex conversion, adding members/operations<br>
&gt; is non-intuitive, not very easy to use.<br>
&gt; &gt; <br>
&gt; &gt; 4) Struct<br>
&gt; &gt; Advantage: Matches fairly wel with the abstraction.<br>
&gt; &gt; Disadvantage: Fairly complex conversion. Not very easy to use
<br>
&gt; without adding members/operations.<br>
&gt; &gt; <br>
&gt; &gt; 5) This was for completeness only, I would be very surprised
if <br>
&gt; anybody would actually propose this… ;-)<br>
&gt; &gt; <br>
&gt; &gt; <br>
&gt; &gt; To me that leaves option 2 and 4.<br>
&gt; &gt; Advantage of 2 over 4:<br>
&gt; &gt; <br>
&gt; &gt; - I find the abstraction a better match. The difference between
1,<br>
&gt; 1.1 and 2 is such that it makes little sense to be to differentiate
<br>
&gt; based on the numerical values. It makes much more sense to <br>
&gt; differentiate based on the “whole number”. AFAIIC they could just
as<br>
&gt; easily have named the versions A, B, C etc. The numbers do not <br>
&gt; convey any information as such.<br>
&gt; &gt; - Switch is easier and more intuitive to use.<br>
&gt; &gt; - Enums can have additional properties and operations similar
to struct.<br>
&gt; &gt; <br>
&gt; &gt; Advantage of 4 over 2:<br>
&gt; &gt; I don’t see any.<br>
&gt; &gt; <br>
&gt; &gt; Regards,<br>
&gt; &gt; Rien<br>
&gt; &gt; <br>
&gt; &gt; Site: </font></tt><a href=http://balancingrock.nl/><tt><font size=2>http://balancingrock.nl</font></tt></a><tt><font size=2><br>
&gt; &gt; Blog: </font></tt><a href=http://swiftrien.blogspot.com/><tt><font size=2>http://swiftrien.blogspot.com</font></tt></a><tt><font size=2><br>
&gt; &gt; Github: </font></tt><a href=http://github.com/Balancingrock><tt><font size=2>http://github.com/Balancingrock</font></tt></a><tt><font size=2><br>
&gt; &gt; Project: </font></tt><a href=http://swiftfire.nl/><tt><font size=2>http://swiftfire.nl</font></tt></a><tt><font size=2>
- An HTTP(S) web server framework in Swift<br>
&gt; &gt; <br>
&gt; &gt; <br>
&gt; &gt; <br>
&gt; &gt;&gt; On 13 Jun 2017, at 22:44, Chris Bailey via swift-server-dev
<br>
&gt; &lt;swift-server-dev@swift.org&gt; wrote:<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; Based on our discussed approach of reviewing each of the
types in<br>
&gt; the HTTP project, I've raised the following PR to convert <br>
&gt; HTTPVersion from (Int, Int) to a struct based on Paulo's proposal:
<br>
&gt; &gt;&gt; &nbsp; &nbsp; &nbsp; </font></tt><a href="https://github.com/swift-server/http/pull/6"><tt><font size=2>https://github.com/swift-server/http/pull/6</font></tt></a><tt><font size=2>
<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; I've not yet added Hashable, Equatable and <br>
&gt; CustomStringConvertible protocols - we can do that if we're happy
<br>
&gt; with the change. <br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; Chris<br>
&gt; &gt;&gt; Unless stated otherwise above:<br>
&gt; &gt;&gt; IBM United Kingdom Limited - Registered in England and Wales
with<br>
&gt; number 741598. <br>
&gt; &gt;&gt; Registered office: PO Box 41, North Harbour, Portsmouth,
Hampshire PO6 3AU<br>
&gt; &gt;&gt; _______________________________________________<br>
&gt; &gt;&gt; swift-server-dev mailing list<br>
&gt; &gt;&gt; swift-server-dev@swift.org<br>
&gt; &gt;&gt; </font></tt><a href="https://lists.swift.org/mailman/listinfo/swift-server-dev"><tt><font size=2>https://lists.swift.org/mailman/listinfo/swift-server-dev</font></tt></a><tt><font size=2><br>
&gt; &gt; <br>
&gt; &gt; _______________________________________________<br>
&gt; &gt; swift-server-dev mailing list<br>
&gt; &gt; swift-server-dev@swift.org<br>
&gt; &gt; </font></tt><a href="https://lists.swift.org/mailman/listinfo/swift-server-dev"><tt><font size=2>https://lists.swift.org/mailman/listinfo/swift-server-dev</font></tt></a><tt><font size=2><br>
&gt; <br>
</font></tt><font size=2 face="sans-serif"><br>
Unless stated otherwise above:<br>
IBM United Kingdom Limited - Registered in England and Wales with number
741598. <br>
Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6
3AU<br>
</font>