252 lines
6.2 KiB
C++
252 lines
6.2 KiB
C++
#ifndef __VALIMP_H
|
||
#define __VALIMP_H
|
||
#pragma option push -b -a8 -pc -Vx- -Ve- -w-inl -w-aus -w-sig
|
||
// -*- C++ -*-
|
||
#ifndef __RW_VALIMP__
|
||
#define __RW_VALIMP__
|
||
|
||
/***************************************************************************
|
||
*
|
||
* valimp - Declarations for the Standard Library valarray
|
||
*
|
||
***************************************************************************
|
||
*
|
||
* Copyright (c) 1994-1999 Rogue Wave Software, Inc. All Rights Reserved.
|
||
*
|
||
* This computer software is owned by Rogue Wave Software, Inc. and is
|
||
* protected by U.S. copyright laws and other laws and by international
|
||
* treaties. This computer software is furnished by Rogue Wave Software,
|
||
* Inc. pursuant to a written license agreement and may be used, copied,
|
||
* transmitted, and stored only in accordance with the terms of such
|
||
* license and with the inclusion of the above copyright notice. This
|
||
* computer software or any other copies thereof may not be provided or
|
||
* otherwise made available to any other person.
|
||
*
|
||
* U.S. Government Restricted Rights. This computer software is provided
|
||
* with Restricted Rights. Use, duplication, or disclosure by the
|
||
* Government is subject to restrictions as set forth in subparagraph (c)
|
||
* (1) (ii) of The Rights in Technical Data and Computer Software clause
|
||
* at DFARS 252.227-7013 or subparagraphs (c) (1) and (2) of the
|
||
* Commercial Computer Software – Restricted Rights at 48 CFR 52.227-19,
|
||
* as applicable. Manufacturer is Rogue Wave Software, Inc., 5500
|
||
* Flatiron Parkway, Boulder, Colorado 80301 USA.
|
||
*
|
||
**************************************************************************/
|
||
|
||
#include <stdcomp.h>
|
||
#include <rw/stddefs.h>
|
||
|
||
#ifndef _RWSTD_NO_NEW_HEADER
|
||
#include <cstddef>
|
||
#include <cstring>
|
||
#else
|
||
#include <stddef.h>
|
||
#include <string.h>
|
||
#endif
|
||
|
||
#include <rw/math.h>
|
||
|
||
#ifndef _RWSTD_NO_NAMESPACE
|
||
namespace std { }
|
||
namespace __rwstd {
|
||
#define _RW_IMP_SPACE(name) ::__rwstd::name
|
||
#else
|
||
#define _RW_IMP_SPACE(name) name
|
||
#endif
|
||
/****************************************************************
|
||
* IMPLEMENTATION FUNCTIONALITIES *
|
||
* *
|
||
* - valarray memory model *
|
||
* - valarray optimization on copy and return *
|
||
* *
|
||
****************************************************************/
|
||
// valarray_traits class
|
||
// allow memory optimization
|
||
// for builtin types and user types
|
||
|
||
template <class T>
|
||
class valarray_traits_optimize
|
||
{
|
||
public:
|
||
static bool _RWSTDExportTemplate optimize_copy() { return false; }
|
||
};
|
||
#ifndef _RWSTD_NO_BOOL
|
||
_RWSTD_TEMPLATE
|
||
class _RWSTDExport valarray_traits_optimize<bool>
|
||
{
|
||
public:
|
||
static bool optimize_copy() { return true; }
|
||
};
|
||
#endif
|
||
|
||
_RWSTD_TEMPLATE
|
||
class _RWSTDExport valarray_traits_optimize<short>
|
||
{
|
||
public:
|
||
static bool optimize_copy() { return true; }
|
||
};
|
||
|
||
_RWSTD_TEMPLATE
|
||
class _RWSTDExport valarray_traits_optimize<unsigned short>
|
||
{
|
||
public:
|
||
static bool optimize_copy() { return true; }
|
||
};
|
||
|
||
_RWSTD_TEMPLATE
|
||
class _RWSTDExport valarray_traits_optimize<int>
|
||
{
|
||
public:
|
||
static bool optimize_copy() { return true; }
|
||
};
|
||
|
||
_RWSTD_TEMPLATE
|
||
class _RWSTDExport valarray_traits_optimize<unsigned int>
|
||
{
|
||
public:
|
||
static bool optimize_copy() { return true; }
|
||
};
|
||
|
||
_RWSTD_TEMPLATE
|
||
class _RWSTDExport valarray_traits_optimize<long>
|
||
{
|
||
public:
|
||
static bool optimize_copy() { return true; }
|
||
};
|
||
|
||
_RWSTD_TEMPLATE
|
||
class _RWSTDExport valarray_traits_optimize<unsigned long>
|
||
{
|
||
public:
|
||
static bool optimize_copy() { return true; }
|
||
};
|
||
|
||
_RWSTD_TEMPLATE
|
||
class _RWSTDExport valarray_traits_optimize<float>
|
||
{
|
||
public:
|
||
static bool optimize_copy() { return true; }
|
||
};
|
||
|
||
_RWSTD_TEMPLATE
|
||
class _RWSTDExport valarray_traits_optimize<double>
|
||
{
|
||
public:
|
||
static bool optimize_copy() { return true; }
|
||
};
|
||
|
||
_RWSTD_TEMPLATE
|
||
class _RWSTDExport valarray_traits_optimize<long double>
|
||
{
|
||
public:
|
||
static bool optimize_copy() { return true; }
|
||
};
|
||
|
||
_RWSTD_TEMPLATE
|
||
class _RWSTDExport valarray_traits_optimize<char>
|
||
{
|
||
public:
|
||
static bool optimize_copy() { return true; }
|
||
};
|
||
|
||
_RWSTD_TEMPLATE
|
||
class _RWSTDExport valarray_traits_optimize<unsigned char>
|
||
{
|
||
public:
|
||
static bool optimize_copy() { return true; }
|
||
};
|
||
// for optimization on return of
|
||
// valarray<T> values
|
||
|
||
template <class T>
|
||
struct _RW_temporary
|
||
{
|
||
|
||
T* store_adr;
|
||
size_t length;
|
||
};
|
||
// Class _RW_array<T>
|
||
// C type array storage class
|
||
// responsible for physical representation
|
||
// of the valarray in memory and memory operations
|
||
|
||
template <class T> class _RW_array {
|
||
|
||
public:
|
||
|
||
_RW_array( )
|
||
: _RW_length(0)
|
||
, _RW_storage(0)
|
||
{ ; }
|
||
|
||
~_RW_array( )
|
||
{ if ( _RW_storage ) delete []_RW_storage; }
|
||
|
||
void _initial_size(size_t size)
|
||
{
|
||
_RW_length = size;
|
||
_RW_storage = new T[_RW_length];
|
||
}
|
||
|
||
void _initialize_with_value(const T&, size_t);
|
||
void _initialize_with_array(const T*, size_t);
|
||
void _copy_memory_array(const _RW_array<T>&);
|
||
|
||
size_t _get_length() const { return _RW_length; }
|
||
|
||
T operator[] (size_t ind) const
|
||
{ return _RW_storage[ind]; }
|
||
|
||
T& operator[] (size_t ind)
|
||
{ return _RW_storage[ind]; }
|
||
|
||
void _replace(T* tmp_adr, size_t tmp_length )
|
||
{
|
||
_RW_storage = tmp_adr;
|
||
_RW_length = tmp_length;
|
||
}
|
||
|
||
T* _RW_get_storage() const { return _RW_storage; }
|
||
|
||
void _RW_invalidate()
|
||
{
|
||
_RW_length = 0;
|
||
_RW_storage = 0;
|
||
}
|
||
|
||
void _RW_copy( T* pointer ) const
|
||
{
|
||
#if !defined(_RWSTD_NO_NEW_HEADER) && !defined(_RWSTD_NO_NAMESPACE)
|
||
std::memcpy( (void*)pointer, (void*)_RW_storage,_RW_length*sizeof(T));
|
||
#else
|
||
memcpy( (void*)pointer, (void*)_RW_storage,_RW_length*sizeof(T));
|
||
#endif
|
||
}
|
||
|
||
void _RW_resize_without_copy( size_t size)
|
||
{
|
||
if ( _RW_storage )
|
||
{
|
||
delete []_RW_storage;
|
||
_RW_storage = 0;
|
||
}
|
||
_RW_length = size;
|
||
if ( size > 0 ) _RW_storage = new T[_RW_length];
|
||
}
|
||
|
||
private:
|
||
size_t _RW_length;
|
||
T* _RW_storage;
|
||
};
|
||
#ifndef _RWSTD_NO_NAMESPACE
|
||
}
|
||
#endif
|
||
#ifdef _RWSTD_NO_TEMPLATE_REPOSITORY
|
||
#include <rw/valimp.cc>
|
||
#endif
|
||
|
||
#endif /* __RW_VALIMP__ */
|
||
|
||
#pragma option pop
|
||
#endif /* __VALIMP_H */
|