1
1
module dpq2.conv.ranges ;
2
2
3
3
4
- import dpq2.conv.time : TimeStamp, TimeStampUTC;
4
+ import dpq2.conv.time: TimeStamp, TimeStampUTC;
5
5
import dpq2.conv.to_d_types;
6
- import dpq2.oids : OidType;
6
+ import dpq2.oids: OidType;
7
7
import dpq2.value;
8
8
9
- import std.bitmanip : bigEndianToNative;
10
- import std.conv : to;
11
- import std.datetime.date : Date ;
12
- import std.exception : enforce;
13
- import std.traits : TemplateOf;
9
+ import std.bitmanip : bigEndianToNative;
10
+ import std.conv : to;
11
+ import std.datetime.date : Date ;
12
+ import std.traits : TemplateOf;
14
13
15
14
16
15
enum PG_RANGE : ubyte {
17
16
/* A range's flags byte contains these bits: */
18
- EMPTY = 0x01 , /* range is empty */
19
- LB_INC = 0x02 , /* lower bound is inclusive */
20
- UB_INC = 0x04 , /* upper bound is inclusive */
21
- LB_INF = 0x08 , /* lower bound is -infinity */
22
- UB_INF = 0x10 , /* upper bound is +infinity */
23
- LB_NULL = 0x20 , /* lower bound is null (NOT USED) */
24
- UB_NULL = 0x40 , /* upper bound is null (NOT USED) */
25
- CONTAIN_EMPTY = 0x80 /* marks a GiST internal-page entry whose
17
+ EMPTY = 0x01 , /* * range is empty */
18
+ LB_INC = 0x02 , /* * lower bound is inclusive */
19
+ UB_INC = 0x04 , /* * upper bound is inclusive */
20
+ LB_INF = 0x08 , /* * lower bound is -infinity */
21
+ UB_INF = 0x10 , /* * upper bound is +infinity */
22
+ LB_NULL = 0x20 , /* * lower bound is null (NOT USED) */
23
+ UB_NULL = 0x40 , /* * upper bound is null (NOT USED) */
24
+ CONTAIN_EMPTY = 0x80 /* * marks a GiST internal-page entry whose
26
25
* subtree contains some empty ranges */
27
26
}
28
27
@@ -49,7 +48,7 @@ if (isRangeType!(T,O))
49
48
immutable (ubyte )[] _data;
50
49
51
50
this (immutable (ubyte )[] binaryData) {
52
- enforce (binaryData.length >= 1 , " cannot construct range with insufficient data" );
51
+ enforceSize (binaryData, 1 , " cannot construct range with insufficient data" );
53
52
54
53
this ._data = binaryData;
55
54
@@ -107,7 +106,7 @@ if (__traits(isSame, TemplateOf!R, Range))
107
106
immutable (ubyte )[] _data;
108
107
109
108
this (immutable (ubyte )[] binaryData) {
110
- enforce (binaryData.length >= uint .sizeof, " cannot construct multirange with insufficient data" );
109
+ enforceSize (binaryData, uint .sizeof, " cannot construct multirange with insufficient data" );
111
110
112
111
this ._data = binaryData;
113
112
binaryData = binaryData[uint .sizeof.. $];
@@ -123,7 +122,12 @@ if (__traits(isSame, TemplateOf!R, Range))
123
122
size_t length () @property { return _data.length ? _data[0 .. uint .sizeof].bigEndianToNative! uint : 0 ; }
124
123
125
124
R opIndex (size_t idx) {
126
- enforce(idx < this .length, " multirange index out of bounds: " ~ this .length.to! string ~ " /" ~ idx.to! string );
125
+ if (! (idx < this .length))
126
+ throw new ValueConvException(
127
+ ConvExceptionType.OUT_OF_RANGE ,
128
+ " multirange index out of bounds: " ~ this .length.to! string ~ " /" ~ idx.to! string ,
129
+ );
130
+
127
131
return data[idx];
128
132
}
129
133
@@ -146,19 +150,19 @@ if (__traits(isSame, TemplateOf!R, Range))
146
150
}
147
151
}
148
152
149
- alias Range ! (int , OidType.Int4) Int4Range ;
150
- alias Range ! (long , OidType.Int8) Int8Range ;
151
- alias Range ! (string , OidType.Numeric, 0 ) NumRange ;
152
- alias Range ! (TimeStamp, OidType.TimeStamp, 8 ) TsRange ;
153
- alias Range ! (TimeStampUTC, OidType.TimeStampWithZone, 8 ) TsTzRange ;
154
- alias Range ! (Date , OidType.Date ) DateRange ;
155
-
156
- alias MultiRange! Int4Range Int4MultiRange ;
157
- alias MultiRange! Int8Range Int8MultiRange ;
158
- alias MultiRange! NumRange NumMultiRange ;
159
- alias MultiRange! TsRange TsMultiRange ;
160
- alias MultiRange! TsTzRange TsTzMultiRange ;
161
- alias MultiRange! DateRange DateMultiRange ;
153
+ alias Int4Range = Range ! (int , OidType.Int4);
154
+ alias Int8Range = Range ! (long , OidType.Int8);
155
+ alias NumRange = Range ! (string , OidType.Numeric, 0 );
156
+ alias TsRange = Range ! (TimeStamp, OidType.TimeStamp, 8 );
157
+ alias TsTzRange = Range ! (TimeStampUTC, OidType.TimeStampWithZone, 8 );
158
+ alias DateRange = Range ! (Date , OidType.Date );
159
+
160
+ alias Int4MultiRange = MultiRange! Int4Range;
161
+ alias Int8MultiRange = MultiRange! Int8Range;
162
+ alias NumMultiRange = MultiRange! NumRange;
163
+ alias TsMultiRange = MultiRange! TsRange;
164
+ alias TsTzMultiRange = MultiRange! TsTzRange;
165
+ alias DateMultiRange = MultiRange! DateRange;
162
166
163
167
package :
164
168
0 commit comments