summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xsrc/usr/diag/prdf/common/util/UtilSMap.H65
1 files changed, 59 insertions, 6 deletions
diff --git a/src/usr/diag/prdf/common/util/UtilSMap.H b/src/usr/diag/prdf/common/util/UtilSMap.H
index bbf337947..a5da03c8d 100755
--- a/src/usr/diag/prdf/common/util/UtilSMap.H
+++ b/src/usr/diag/prdf/common/util/UtilSMap.H
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2007,2013 */
+/* COPYRIGHT International Business Machines Corp. 2007,2014 */
/* */
/* p1 */
/* */
@@ -105,7 +105,17 @@ class UtilSMap
void clear()
{
- if (NULL != iv_memblock) free(iv_memblock);
+ if (NULL != iv_memblock)
+ {
+ for( size_type i = 0; i < iv_size; i++ )
+ {
+ ((key_type *)&iv_memblock[i])->~key_type();
+ ((data_type *)
+ &iv_memblock[i + cv_firstSize])->~data_type();
+ }
+ free(iv_memblock);
+ }
+
iv_memblock = NULL;
iv_size = 0;
iv_blockCount = 2;
@@ -123,11 +133,13 @@ class UtilSMap
iv_memblock = (char *)
realloc(iv_memblock, cv_blockSize * iv_blockCount);
}
- (*(key_type *)&iv_memblock[cv_blockSize * iv_size]) = k;
- data_type * l_rc = (data_type *)
- &iv_memblock[cv_blockSize * iv_size + cv_firstSize];
- (*l_rc) = v;
+ new ((key_type *)&iv_memblock[cv_blockSize * iv_size])
+ (key_type) (k);
+
+ data_type * l_rc = new ((data_type *)
+ &iv_memblock[cv_blockSize * iv_size + cv_firstSize])
+ (data_type) (v);
iv_size++;
@@ -143,6 +155,47 @@ class UtilSMap
return *l_rc;
};
+ UtilSMap & operator = (const UtilSMap & i_rhs )
+ {
+ if( &i_rhs == this ) return *this;
+
+ clear();
+ iv_size = i_rhs.iv_size;
+ iv_blockCount = i_rhs.iv_blockCount;
+
+ if( NULL != i_rhs.iv_memblock )
+ {
+ iv_memblock = (char *) malloc( cv_blockSize * iv_blockCount);
+ for( size_type i = 0; i < iv_size; i++ )
+ {
+ new ((key_type *)&iv_memblock[i])
+ (key_type)( i_rhs.iv_memblock[i] );
+
+ new ((data_type *) &iv_memblock[ i + cv_firstSize])
+ (data_type) (i_rhs.iv_memblock[ i + cv_firstSize]);
+ }
+ }
+ return *this;
+ };
+ UtilSMap (const UtilSMap & i_rhs )
+ {
+ iv_size = i_rhs.iv_size;
+ iv_blockCount = i_rhs.iv_blockCount;
+ iv_memblock = NULL;
+ if( NULL != i_rhs.iv_memblock )
+ {
+ iv_memblock = (char *) malloc( cv_blockSize * iv_blockCount);
+ for( size_type i = 0; i < iv_size; i++ )
+ {
+ new ((key_type *)&iv_memblock[i])
+ (key_type)( i_rhs.iv_memblock[i] );
+
+ new ((data_type *) &iv_memblock[ i + cv_firstSize])
+ (data_type) (i_rhs.iv_memblock[ i + cv_firstSize]);
+ }
+ }
+ };
+
private:
data_type * find(const key_type & k)
{
OpenPOWER on IntegriCloud