SHOGUN  3.2.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SGDynamicRefObjectArray.h
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation; either version 3 of the License, or
5  * (at your option) any later version.
6  *
7  * Written (W) 1999-2009 Soeren Sonnenburg
8  * Written (W) 2011-2012 Heiko Strathmann
9  * Copyright (C) 1999-2009 Fraunhofer Institute FIRST and Max-Planck-Society
10  */
11 
12 #ifndef _DYNAMIC_REFOBJECT_ARRAY_H_
13 #define _DYNAMIC_REFOBJECT_ARRAY_H_
14 
15 #include <shogun/lib/config.h>
16 
17 #include <shogun/base/RefObject.h>
18 #include <shogun/base/DynArray.h>
19 #include <shogun/base/Parameter.h>
20 
21 namespace shogun
22 {
34 {
35  public:
38  : CSGObject(), m_array(), name("Array")
39  {
40  dim1_size=1;
41  dim2_size=1;
42  dim3_size=1;
43  }
44 
51  SGDynamicRefObjectArray(int32_t dim1, int32_t dim2=1, int32_t dim3=1)
52  : CSGObject(), m_array(dim1*dim2*dim3), name("Array")
53  {
54  dim1_size=dim1;
55  dim2_size=dim2;
56  dim3_size=dim3;
57  }
58 
66  SGDynamicRefObjectArray(CRefObject** p_array, int32_t p_dim1_size, bool p_free_array=true, bool p_copy_array=false)
67  : CSGObject(), m_array(p_array, p_dim1_size, p_free_array, p_copy_array), name("Array")
68  {
69  dim1_size=p_dim1_size;
70  dim2_size=1;
71  dim3_size=1;
72  }
73 
82  SGDynamicRefObjectArray(CRefObject** p_array, int32_t p_dim1_size, int32_t p_dim2_size,
83  bool p_free_array=true, bool p_copy_array=false)
84  : CSGObject(), m_array(p_array, p_dim1_size*p_dim2_size, p_free_array, p_copy_array), name("Array")
85  {
86  dim1_size=p_dim1_size;
87  dim2_size=p_dim2_size;
88  dim3_size=1;
89  }
90 
100  SGDynamicRefObjectArray(CRefObject** p_array, int32_t p_dim1_size, int32_t p_dim2_size,
101  int32_t p_dim3_size, bool p_free_array=true, bool p_copy_array=false)
102  : CSGObject(), m_array(p_array, p_dim1_size*p_dim2_size*p_dim3_size, p_free_array, p_copy_array), name("Array")
103  {
104  dim1_size=p_dim1_size;
105  dim2_size=p_dim2_size;
106  dim3_size=p_dim3_size;
107  }
108 
109  virtual ~SGDynamicRefObjectArray() { unref_all(); }
110 
116  inline int32_t set_granularity(int32_t g)
117  { return m_array.set_granularity(g); }
118 
123  inline int32_t get_array_size()
124  {
125  return m_array.get_array_size();
126  }
127 
133  inline void get_array_size(int32_t& dim1, int32_t& dim2)
134  {
135  dim1=dim1_size;
136  dim2=dim2_size;
137  }
138 
145  inline void get_array_size(int32_t& dim1, int32_t& dim2, int32_t& dim3)
146  {
147  dim1=dim1_size;
148  dim2=dim2_size;
149  dim3=dim3_size;
150  }
151 
156  inline int32_t get_dim1() { return dim1_size; }
157 
162  inline int32_t get_dim2() { return dim2_size; }
163 
168  inline int32_t get_dim3() { return dim3_size; }
169 
174  inline int32_t get_num_elements() const
175  {
176  return m_array.get_num_elements();
177  }
178 
186  inline CRefObject* get_element(int32_t index) const
187  {
188  CRefObject* elem=m_array.get_element(index);
189  SG_REF(elem);
190  return elem;
191  }
192 
200  inline CRefObject* element(int32_t idx1, int32_t idx2=0, int32_t idx3=0)
201  {
202  return get_element(idx1+dim1_size*(idx2+dim2_size*idx3));
203  }
204 
209  inline CRefObject* get_last_element() const
210  {
211  CRefObject* e=m_array.get_last_element();
212  SG_REF(e);
213  return e;
214  }
215 
223  inline CRefObject* get_element_safe(int32_t index) const
224  {
225  CRefObject* e=m_array.get_element_safe(index);
226  SG_REF(e);
227  return e;
228  }
229 
238  inline bool set_element(CRefObject* e, int32_t idx1, int32_t idx2=0, int32_t idx3=0)
239  {
240  int32_t idx = idx1+dim1_size*(idx2+dim2_size*idx3);
241  CRefObject* old=NULL;
242 
243  if (idx<get_num_elements())
244  old = (CRefObject*) m_array.get_element(idx);
245 
246  bool success=m_array.set_element(e, idx);
247  if (success)
248  {
249  SG_REF(e);
250  SG_UNREF(old);
251  }
252 
253  /* ref before unref to prevent deletion if new=old */
254  return success;
255  }
256 
263  inline bool insert_element(CRefObject* e, int32_t index)
264  {
265  bool success=m_array.insert_element(e, index);
266  if (success)
267  SG_REF(e);
268 
269  return success;
270  }
271 
277  inline bool append_element(CRefObject* e)
278  {
279  bool success=m_array.append_element(e);
280  if (success)
281  SG_REF(e);
282 
283  return success;
284  }
285 
291  inline void push_back(CRefObject* e)
292  {
293  SG_REF(e);
294  m_array.push_back(e);
295  }
296 
300  inline void pop_back()
301  {
302  CRefObject* e=m_array.back();
303  SG_UNREF(e);
304 
305  m_array.pop_back();
306  }
307 
313  inline CRefObject* back() const
314  {
315  CRefObject* e=m_array.back();
316  SG_REF(e);
317  return e;
318  }
319 
326  inline int32_t find_element(CRefObject* elem) const
327  {
328  return m_array.find_element(elem);
329  }
330 
337  inline bool delete_element(int32_t idx)
338  {
339  CRefObject* e=m_array.get_element(idx);
340  SG_UNREF(e);
341  m_array.set_element(NULL, idx);
342 
343  return m_array.delete_element(idx);
344  }
345 
347  inline void clear_array()
348  {
349  unref_all();
350  m_array.clear_array(NULL);
351  }
352 
354  inline void reset_array()
355  {
356  unref_all();
357  m_array.reset(NULL);
358  }
359 
366  {
367  /* SG_REF all new elements (implicitly) */
368  for (index_t i=0; i<orig.get_num_elements(); ++i)
369  orig.get_element(i);
370 
371  /* unref after adding to avoid possible deletion */
372  unref_all();
373 
374  /* copy pointer DynArray */
375  m_array=orig.m_array;
376  return *this;
377  }
378 
380  inline CRefObject** get_array() const { return m_array.get_array(); }
381 
383  inline void shuffle() { m_array.shuffle(); }
384 
386  inline void shuffle(CRandom * rand) { m_array.shuffle(rand); }
387 
392  inline void set_array_name(const char* p_name)
393  {
394  name=p_name;
395  }
396 
401  inline const char* get_array_name() const { return name; }
402 
404  virtual const char* get_name() const
405  { return "DynamicRefObjectArray"; }
406 
407  private:
409  inline void unref_all()
410  {
411  /* SG_UNREF all my elements */
412  for (index_t i=0; i<m_array.get_num_elements(); ++i)
413  {
414  SG_UNREF(*m_array.get_element_ptr(i));
415  }
416  }
417 
418  private:
420  DynArray<CRefObject*> m_array;
421 
423  int32_t dim1_size;
424 
426  int32_t dim2_size;
427 
429  int32_t dim3_size;
430 
432  const char* name;
433 
434 };
435 }
436 #endif /* _DYNAMIC_REFOBJECT_ARRAY_H_ */

SHOGUN Machine Learning Toolbox - Documentation