@@ -8,117 +8,23 @@ import org.jetbrains.kotlinx.dataframe.impl.isPrimitiveArray
8
8
import kotlin.reflect.KType
9
9
import kotlin.reflect.typeOf
10
10
11
- internal class ColumnDataHolderImpl <T > private constructor(
12
- private val list : List <T >,
13
- distinct : Lazy <Set <T >>? ,
14
- ) : ColumnDataHolder<T> {
11
+ internal class ColumnDataHolderImpl <T >(private val list : List <T >, distinct : Lazy <Set <T >>? ) : ColumnDataHolder<T> {
15
12
16
13
override val distinct = distinct ? : lazy { list.toSet() }
14
+
17
15
override val size: Int get() = list.size
18
16
19
17
override fun toSet (): Set <T > = distinct.value
18
+
20
19
override fun toList (): List <T > = list
20
+
21
21
override fun get (index : Int ): T = list[index]
22
+
22
23
override fun get (range : IntRange ): List <T > = list.subList(range.first, range.last + 1 )
24
+
23
25
override fun contains (value : T ): Boolean = list.contains(value)
24
- override fun iterator (): Iterator <T > = list.iterator()
25
26
26
- companion object {
27
-
28
- /* *
29
- * Constructs [ColumnDataHolderImpl] using an [asList] wrapper around the [list].
30
- */
31
- @Suppress(" UNCHECKED_CAST" )
32
- internal fun <T > of (list : Collection <T >, type : KType , distinct : Lazy <Set <T >>? = null): ColumnDataHolder <T > {
33
- if (list is ColumnDataHolder <* >) return list as ColumnDataHolder <T >
34
-
35
- try {
36
- val newList = when (type) {
37
- BOOLEAN -> (list as Collection <Boolean >).toBooleanArray().asList()
38
- BYTE -> (list as Collection <Byte >).toByteArray().asList()
39
- SHORT -> (list as Collection <Short >).toShortArray().asList()
40
- INT -> (list as Collection <Int >).toIntArray().asList()
41
- LONG -> (list as Collection <Long >).toLongArray().asList()
42
- FLOAT -> (list as Collection <Float >).toFloatArray().asList()
43
- DOUBLE -> (list as Collection <Double >).toDoubleArray().asList()
44
- CHAR -> (list as Collection <Char >).toCharArray().asList()
45
- UBYTE -> (list as Collection <UByte >).toUByteArray().asList()
46
- USHORT -> (list as Collection <UShort >).toUShortArray().asList()
47
- UINT -> (list as Collection <UInt >).toUIntArray().asList()
48
- ULONG -> (list as Collection <ULong >).toULongArray().asList()
49
- else -> list.asList()
50
- } as List <T >
51
-
52
- return ColumnDataHolderImpl (newList, distinct)
53
- } catch (e: Exception ) {
54
- throw IllegalArgumentException (" Can't create ColumnDataHolder from $list and type $type " , e)
55
- }
56
- }
57
-
58
- /* *
59
- * Constructs [ColumnDataHolderImpl] using an [asList] wrapper around the [array].
60
- * If [array] is an array of primitives, it will be converted to a primitive array first before being
61
- * wrapped with [asList].
62
- */
63
- @Suppress(" UNCHECKED_CAST" )
64
- internal fun <T > of (array : Array <T >, type : KType , distinct : Lazy <Set <T >>? = null): ColumnDataHolder <T > {
65
- try {
66
- val list = when (type) {
67
- BOOLEAN -> (array as Array <Boolean >).toBooleanArray().asList()
68
- BYTE -> (array as Array <Byte >).toByteArray().asList()
69
- SHORT -> (array as Array <Short >).toShortArray().asList()
70
- INT -> (array as Array <Int >).toIntArray().asList()
71
- LONG -> (array as Array <Long >).toLongArray().asList()
72
- FLOAT -> (array as Array <Float >).toFloatArray().asList()
73
- DOUBLE -> (array as Array <Double >).toDoubleArray().asList()
74
- CHAR -> (array as Array <Char >).toCharArray().asList()
75
- UBYTE -> (array as Array <UByte >).toUByteArray().asList()
76
- USHORT -> (array as Array <UShort >).toUShortArray().asList()
77
- UINT -> (array as Array <UInt >).toUIntArray().asList()
78
- ULONG -> (array as Array <ULong >).toULongArray().asList()
79
- else -> array.asList()
80
- } as List <T >
81
-
82
- return ColumnDataHolderImpl (list, distinct)
83
- } catch (e: Exception ) {
84
- throw IllegalArgumentException (
85
- " Can't create ColumnDataHolder from $array and mismatching type $type " ,
86
- e
87
- )
88
- }
89
- }
90
-
91
- /* *
92
- * Constructs [ColumnDataHolderImpl] using an [asList] wrapper around the [primitiveArray].
93
- * [primitiveArray] must be an array of primitives, returns `null` if something goes wrong.
94
- */
95
- @Suppress(" UNCHECKED_CAST" )
96
- internal fun <T > of (primitiveArray : Any , type : KType , distinct : Lazy <Set <T >>? = null): ColumnDataHolder <T > {
97
- val newList = when {
98
- type == BOOLEAN && primitiveArray is BooleanArray -> primitiveArray.asList()
99
- type == BYTE && primitiveArray is ByteArray -> primitiveArray.asList()
100
- type == SHORT && primitiveArray is ShortArray -> primitiveArray.asList()
101
- type == INT && primitiveArray is IntArray -> primitiveArray.asList()
102
- type == LONG && primitiveArray is LongArray -> primitiveArray.asList()
103
- type == FLOAT && primitiveArray is FloatArray -> primitiveArray.asList()
104
- type == DOUBLE && primitiveArray is DoubleArray -> primitiveArray.asList()
105
- type == CHAR && primitiveArray is CharArray -> primitiveArray.asList()
106
- type == UBYTE && primitiveArray is UByteArray -> primitiveArray.asList()
107
- type == USHORT && primitiveArray is UShortArray -> primitiveArray.asList()
108
- type == UINT && primitiveArray is UIntArray -> primitiveArray.asList()
109
- type == ULONG && primitiveArray is ULongArray -> primitiveArray.asList()
110
- ! primitiveArray.isPrimitiveArray -> throw IllegalArgumentException (
111
- " Can't create ColumnDataHolder from non primitive array $primitiveArray and type $type "
112
- )
113
-
114
- else -> throw IllegalArgumentException (
115
- " Can't create ColumnDataHolder from primitive array $primitiveArray and type $type "
116
- )
117
- } as List <T >
118
-
119
- return ColumnDataHolderImpl (newList, distinct)
120
- }
121
- }
27
+ override fun iterator (): Iterator <T > = list.iterator()
122
28
}
123
29
124
30
private val BOOLEAN = typeOf<Boolean >()
@@ -133,3 +39,121 @@ private val UBYTE = typeOf<UByte>()
133
39
private val USHORT = typeOf<UShort >()
134
40
private val UINT = typeOf<UInt >()
135
41
private val ULONG = typeOf<ULong >()
42
+
43
+ /* *
44
+ * Constructs [ColumnDataHolderImpl] using an [asList] wrapper around the [list].
45
+ */
46
+ @Suppress(" UNCHECKED_CAST" )
47
+ internal fun <T > ColumnDataHolder.Companion.of (
48
+ list : Collection <T >,
49
+ type : KType ,
50
+ distinct : Lazy <Set <T >>? = null,
51
+ ): ColumnDataHolder <T > {
52
+ if (list is ColumnDataHolder <* >) return list as ColumnDataHolder <T >
53
+
54
+ try {
55
+ val newList = when (type) {
56
+ BOOLEAN -> (list as Collection <Boolean >).toBooleanArray().asList()
57
+ BYTE -> (list as Collection <Byte >).toByteArray().asList()
58
+ SHORT -> (list as Collection <Short >).toShortArray().asList()
59
+ INT -> (list as Collection <Int >).toIntArray().asList()
60
+ LONG -> (list as Collection <Long >).toLongArray().asList()
61
+ FLOAT -> (list as Collection <Float >).toFloatArray().asList()
62
+ DOUBLE -> (list as Collection <Double >).toDoubleArray().asList()
63
+ CHAR -> (list as Collection <Char >).toCharArray().asList()
64
+ UBYTE -> (list as Collection <UByte >).toUByteArray().asList()
65
+ USHORT -> (list as Collection <UShort >).toUShortArray().asList()
66
+ UINT -> (list as Collection <UInt >).toUIntArray().asList()
67
+ ULONG -> (list as Collection <ULong >).toULongArray().asList()
68
+ else -> list.asList()
69
+ } as List <T >
70
+
71
+ return ColumnDataHolderImpl (newList, distinct)
72
+ } catch (e: Exception ) {
73
+ throw IllegalArgumentException (" Can't create ColumnDataHolder from $list and type $type " , e)
74
+ }
75
+ }
76
+
77
+ /* *
78
+ * Constructs [ColumnDataHolderImpl] using an [asList] wrapper around the [array].
79
+ * If [array] is an array of primitives, it will be converted to a primitive array first before being
80
+ * wrapped with [asList].
81
+ */
82
+ @Suppress(" UNCHECKED_CAST" )
83
+ internal fun <T > ColumnDataHolder.Companion.of (
84
+ array : Array <T >,
85
+ type : KType ,
86
+ distinct : Lazy <Set <T >>? = null,
87
+ ): ColumnDataHolder <T > {
88
+ try {
89
+ val list = when (type) {
90
+ BOOLEAN -> (array as Array <Boolean >).toBooleanArray().asList()
91
+ BYTE -> (array as Array <Byte >).toByteArray().asList()
92
+ SHORT -> (array as Array <Short >).toShortArray().asList()
93
+ INT -> (array as Array <Int >).toIntArray().asList()
94
+ LONG -> (array as Array <Long >).toLongArray().asList()
95
+ FLOAT -> (array as Array <Float >).toFloatArray().asList()
96
+ DOUBLE -> (array as Array <Double >).toDoubleArray().asList()
97
+ CHAR -> (array as Array <Char >).toCharArray().asList()
98
+ UBYTE -> (array as Array <UByte >).toUByteArray().asList()
99
+ USHORT -> (array as Array <UShort >).toUShortArray().asList()
100
+ UINT -> (array as Array <UInt >).toUIntArray().asList()
101
+ ULONG -> (array as Array <ULong >).toULongArray().asList()
102
+ else -> array.asList()
103
+ } as List <T >
104
+
105
+ return ColumnDataHolderImpl (list, distinct)
106
+ } catch (e: Exception ) {
107
+ throw IllegalArgumentException (
108
+ " Can't create ColumnDataHolder from $array and mismatching type $type " ,
109
+ e,
110
+ )
111
+ }
112
+ }
113
+
114
+ /* *
115
+ * Constructs [ColumnDataHolderImpl] using an [asList] wrapper around the [primitiveArray].
116
+ * [primitiveArray] must be an array of primitives, returns `null` if something goes wrong.
117
+ */
118
+ @Suppress(" UNCHECKED_CAST" )
119
+ internal fun <T > ColumnDataHolder.Companion.of (
120
+ primitiveArray : Any ,
121
+ type : KType ,
122
+ distinct : Lazy <Set <T >>? = null,
123
+ ): ColumnDataHolder <T > {
124
+ val newList = when {
125
+ type == BOOLEAN && primitiveArray is BooleanArray -> primitiveArray.asList()
126
+
127
+ type == BYTE && primitiveArray is ByteArray -> primitiveArray.asList()
128
+
129
+ type == SHORT && primitiveArray is ShortArray -> primitiveArray.asList()
130
+
131
+ type == INT && primitiveArray is IntArray -> primitiveArray.asList()
132
+
133
+ type == LONG && primitiveArray is LongArray -> primitiveArray.asList()
134
+
135
+ type == FLOAT && primitiveArray is FloatArray -> primitiveArray.asList()
136
+
137
+ type == DOUBLE && primitiveArray is DoubleArray -> primitiveArray.asList()
138
+
139
+ type == CHAR && primitiveArray is CharArray -> primitiveArray.asList()
140
+
141
+ type == UBYTE && primitiveArray is UByteArray -> primitiveArray.asList()
142
+
143
+ type == USHORT && primitiveArray is UShortArray -> primitiveArray.asList()
144
+
145
+ type == UINT && primitiveArray is UIntArray -> primitiveArray.asList()
146
+
147
+ type == ULONG && primitiveArray is ULongArray -> primitiveArray.asList()
148
+
149
+ ! primitiveArray.isPrimitiveArray -> throw IllegalArgumentException (
150
+ " Can't create ColumnDataHolder from non primitive array $primitiveArray and type $type " ,
151
+ )
152
+
153
+ else -> throw IllegalArgumentException (
154
+ " Can't create ColumnDataHolder from primitive array $primitiveArray and type $type " ,
155
+ )
156
+ } as List <T >
157
+
158
+ return ColumnDataHolderImpl (newList, distinct)
159
+ }
0 commit comments