This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
CodeBlocksPortable/Borland/BCC55/Include/Rw/valimp.h

252 lines
6.2 KiB
C
Raw Permalink Normal View History

#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 <EFBFBD> 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 */