|
@@ -54,7 +54,7 @@ interface ReferenceImageDatabaseEntry
|
54
|
54
|
export class ReferenceImageDatabase implements Iterable<ReferenceImage>
|
55
|
55
|
{
|
56
|
56
|
/** Entries */
|
57
|
|
- private _entries: ReferenceImageDatabaseEntry[];
|
|
57
|
+ private _entries: Map<string, ReferenceImageDatabaseEntry>;
|
58
|
58
|
|
59
|
59
|
/** Maximum number of entries */
|
60
|
60
|
private _capacity: number;
|
|
@@ -73,7 +73,7 @@ export class ReferenceImageDatabase implements Iterable<ReferenceImage>
|
73
|
73
|
constructor()
|
74
|
74
|
{
|
75
|
75
|
this._capacity = DEFAULT_CAPACITY;
|
76
|
|
- this._entries = [];
|
|
76
|
+ this._entries = new Map();
|
77
|
77
|
this._locked = false;
|
78
|
78
|
this._busy = false;
|
79
|
79
|
}
|
|
@@ -83,7 +83,7 @@ export class ReferenceImageDatabase implements Iterable<ReferenceImage>
|
83
|
83
|
*/
|
84
|
84
|
get count(): number
|
85
|
85
|
{
|
86
|
|
- return this._entries.length;
|
|
86
|
+ return this._entries.size;
|
87
|
87
|
}
|
88
|
88
|
|
89
|
89
|
/**
|
|
@@ -113,7 +113,8 @@ export class ReferenceImageDatabase implements Iterable<ReferenceImage>
|
113
|
113
|
*/
|
114
|
114
|
*[Symbol.iterator](): Iterator<ReferenceImage>
|
115
|
115
|
{
|
116
|
|
- const ref = this._entries.map(entry => entry.referenceImage);
|
|
116
|
+ const arr = Array.from(this._entries.values());
|
|
117
|
+ const ref = arr.map(entry => entry.referenceImage);
|
117
|
118
|
yield* ref;
|
118
|
119
|
}
|
119
|
120
|
|
|
@@ -127,14 +128,20 @@ export class ReferenceImageDatabase implements Iterable<ReferenceImage>
|
127
|
128
|
*/
|
128
|
129
|
add(referenceImages: ReferenceImage[]): SpeedyPromise<void>
|
129
|
130
|
{
|
|
131
|
+ const n = referenceImages.length;
|
|
132
|
+
|
130
|
133
|
// handle no input
|
131
|
|
- if(referenceImages.length == 0)
|
|
134
|
+ if(n == 0)
|
132
|
135
|
return Speedy.Promise.resolve();
|
133
|
136
|
|
134
|
137
|
// handle multiple images as input
|
135
|
|
- if(referenceImages.length > 1) {
|
136
|
|
- const promises = referenceImages.map(image => this.add([ image ]));
|
137
|
|
- return Utils.runInSequence(promises);
|
|
138
|
+ if(n > 1) {
|
|
139
|
+ Utils.log(`Loading ${n} reference image${n != 1 ? 's' : ''}...`);
|
|
140
|
+ const preloadMedias = referenceImages.map(referenceImage => Speedy.load(referenceImage.image));
|
|
141
|
+ return Speedy.Promise.all(preloadMedias).then(() => {
|
|
142
|
+ const promises = referenceImages.map(referenceImage => this.add([ referenceImage ]));
|
|
143
|
+ return Utils.runInSequence(promises);
|
|
144
|
+ });
|
138
|
145
|
}
|
139
|
146
|
|
140
|
147
|
// handle a single image as input
|
|
@@ -157,19 +164,17 @@ export class ReferenceImageDatabase implements Iterable<ReferenceImage>
|
157
|
164
|
throw new IllegalArgumentError(`Can't add reference image "${referenceImage.name}" to the database: invalid image`);
|
158
|
165
|
|
159
|
166
|
// check for duplicate names
|
160
|
|
- if(this._entries.find(entry => entry.referenceImage.name === referenceImage.name) !== undefined)
|
|
167
|
+ if(this._entries.has(referenceImage.name))
|
161
|
168
|
throw new IllegalArgumentError(`Can't add reference image "${referenceImage.name}" to the database: found duplicated name`);
|
162
|
169
|
|
163
|
|
- // load the media and add the reference image to the database
|
164
|
|
- Utils.log(`Loading reference image "${referenceImage.name}"...`);
|
|
170
|
+ // add the reference image to the database
|
|
171
|
+ Utils.log(`Adding reference image "${referenceImage.name}" to the database...`);
|
165
|
172
|
this._busy = true;
|
166
|
173
|
return Speedy.load(referenceImage.image).then(media => {
|
|
174
|
+ const name = referenceImage.name || generateUniqueName();
|
167
|
175
|
this._busy = false;
|
168
|
|
- this._entries.push({
|
169
|
|
- referenceImage: Object.freeze({
|
170
|
|
- ...referenceImage,
|
171
|
|
- name: referenceImage.name || generateUniqueName()
|
172
|
|
- }),
|
|
176
|
+ this._entries.set(name, {
|
|
177
|
+ referenceImage: Object.freeze(Object.assign({ }, referenceImage, { name })),
|
173
|
178
|
media: media
|
174
|
179
|
});
|
175
|
180
|
});
|
|
@@ -195,11 +200,11 @@ export class ReferenceImageDatabase implements Iterable<ReferenceImage>
|
195
|
200
|
*/
|
196
|
201
|
_findMedia(name: string): SpeedyMedia
|
197
|
202
|
{
|
198
|
|
- for(let i = 0; i < this._entries.length; i++) {
|
199
|
|
- if(this._entries[i].referenceImage.name === name)
|
200
|
|
- return this._entries[i].media;
|
201
|
|
- }
|
|
203
|
+ const entry = this._entries.get(name);
|
|
204
|
+
|
|
205
|
+ if(!entry)
|
|
206
|
+ throw new IllegalArgumentError(`Can't find reference image "${name}"`);
|
202
|
207
|
|
203
|
|
- throw new IllegalArgumentError(`Can't find reference image "${name}"`);
|
|
208
|
+ return entry.media;
|
204
|
209
|
}
|
205
|
210
|
}
|