@@ -189,35 +189,76 @@ static void clip_log_internal(enum ggml_log_level level, const char * format, ..
189
189
// cpp wrappers
190
190
//
191
191
192
+ // wrapper for clip_image_size
193
+ struct clip_image_size_deleter {
194
+ void operator ()(clip_image_size * val) { clip_image_size_free (val); }
195
+ };
196
+ typedef std::unique_ptr<clip_image_size, clip_image_size_deleter> clip_image_size_ptr;
197
+
198
+ // use composition to avoid problems with inheritance from STL classes
199
+ template <typename T, typename Initializer, typename Deleter>
200
+ struct clip_image_buffer_base {
201
+ std::unique_ptr<T, Deleter> ptr;
202
+ clip_image_buffer_base () : ptr(Initializer()()) {}
203
+ explicit clip_image_buffer_base (T* p) : ptr(p) {}
204
+ clip_image_buffer_base (const clip_image_buffer_base& other) = delete ;
205
+ clip_image_buffer_base& operator =(const clip_image_buffer_base& other) = delete ;
206
+ clip_image_buffer_base (clip_image_buffer_base&& other) noexcept = default ;
207
+ clip_image_buffer_base& operator =(clip_image_buffer_base&& other) noexcept = default ;
208
+ ~clip_image_buffer_base () = default ;
209
+ void reset (T* p = nullptr ) { ptr.reset (p); }
210
+ T* get () const noexcept { return ptr.get (); }
211
+ T& operator *() const { return *ptr; }
212
+ T* operator ->() const noexcept { return ptr.get (); }
213
+ explicit operator bool () const noexcept { return static_cast <bool >(ptr); }
214
+ };
215
+
216
+ // wrapper for clip_image_u8
217
+ struct clip_image_u8_initializer {
218
+ clip_image_u8 * operator ()() { return clip_image_u8_init (); }
219
+ };
192
220
struct clip_image_u8_deleter {
193
221
void operator ()(clip_image_u8 * val) { clip_image_u8_free (val); }
194
222
};
223
+ using clip_image_u8_ptr = clip_image_buffer_base<clip_image_u8, clip_image_u8_initializer, clip_image_u8_deleter>;
195
224
225
+ // wrapper for clip_image_f32
226
+ struct clip_image_f32_initializer {
227
+ clip_image_f32 * operator ()() { return clip_image_f32_init (); }
228
+ };
196
229
struct clip_image_f32_deleter {
197
230
void operator ()(clip_image_f32 * val) { clip_image_f32_free (val); }
198
231
};
199
-
200
- struct clip_image_size_deleter {
201
- void operator ()(clip_image_size * val) { clip_image_size_free (val); }
202
- };
203
-
204
- struct clip_image_u8_ptr : std::unique_ptr<clip_image_u8, clip_image_u8_deleter> {
205
- clip_image_u8_ptr () : std::unique_ptr<clip_image_u8, clip_image_u8_deleter>(clip_image_u8_init()) {}
232
+ using clip_image_f32_ptr = clip_image_buffer_base<clip_image_f32, clip_image_f32_initializer, clip_image_f32_deleter>;
233
+
234
+ // use composition to avoid problems with inheritance from STL classes
235
+ template <typename ImagePtrType>
236
+ struct clip_image_batch_base {
237
+ std::vector<ImagePtrType> images;
238
+ clip_image_batch_base () = default ;
239
+ void push_back (ImagePtrType&& value) { images.push_back (std::move (value)); }
240
+ void clear () noexcept { images.clear (); }
241
+ void reserve (size_t n) { images.reserve (n); }
242
+
243
+ // Capacity
244
+ size_t size () const noexcept { return images.size (); }
245
+ bool empty () const noexcept { return images.empty (); }
246
+
247
+ // Element access
248
+ ImagePtrType& operator [](size_t pos) { return images[pos]; }
249
+ const ImagePtrType& operator [](size_t pos) const { return images[pos]; }
250
+ ImagePtrType& at (size_t pos) { return images.at (pos); }
251
+ const ImagePtrType& at (size_t pos) const { return images.at (pos); }
206
252
};
207
253
208
- struct clip_image_f32_ptr : std::unique_ptr<clip_image_f32, clip_image_f32_deleter> {
209
- clip_image_f32_ptr () : std::unique_ptr<clip_image_f32, clip_image_f32_deleter>(clip_image_f32_init()) {}
254
+ struct clip_image_u8_batch : clip_image_batch_base<clip_image_u8_ptr> {
255
+ clip_image_u8_batch () = default ;
256
+ ~clip_image_u8_batch () = default ;
210
257
};
211
258
212
- typedef std::unique_ptr<clip_image_size, clip_image_size_deleter> clip_image_size_ptr;
213
-
214
- // these need to be struct to maintain compatibility with C interface
215
- struct clip_image_u8_batch : std::vector<clip_image_u8_ptr> {
216
- clip_image_u8_batch () : std::vector<clip_image_u8_ptr>() {}
217
- };
218
- struct clip_image_f32_batch : std::vector<clip_image_f32_ptr> {
219
- clip_image_f32_batch () : std::vector<clip_image_f32_ptr>() {}
220
- ~clip_image_f32_batch () {}
259
+ struct clip_image_f32_batch : clip_image_batch_base<clip_image_f32_ptr> {
260
+ clip_image_f32_batch () = default ;
261
+ ~clip_image_f32_batch () = default ;
221
262
};
222
263
223
264
0 commit comments