blob: 1b7b59f179d63f29557593f27ca8392b0be1755b [file] [log] [blame]
/***************************************************************************
*
* rw_value.h - defines a User Defined Class type and User Defined POD type
*
* $Id$
*
***************************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*
* Copyright 1994-2005 Rogue Wave Software.
*
**************************************************************************/
#ifndef RW_VALUE_H_INCLUDED
#define RW_VALUE_H_INCLUDED
#include <testdefs.h>
#include <alg_test.h> // for conv_to_bool
/**************************************************************************/
struct UserData
{
int val_; // object's value
};
/**************************************************************************/
struct _TEST_EXPORT UserPOD
{
UserData data_;
static UserPOD
from_char (char c)
{
UserPOD x;
x.data_.val_ = c;
return x;
}
// construct an array of objects of type UserPOD each initialized
// from the corresponding element of the character array
// when the last argument is true and the character array
// is not sorted in ascending order the function fails by
// returning 0
static UserPOD*
from_char (const char*, _RWSTD_SIZE_T = _RWSTD_SIZE_MAX,
bool = false);
// returns a pointer to the first element in the sequence of UserClass
// whose value is not equal to the corresponding element of
// the character string or 0 when no such element exists
static const UserPOD* mismatch (const UserPOD*, const char*,
_RWSTD_SIZE_T /* len */ = _RWSTD_SIZE_MAX);
};
/**************************************************************************/
// objects of class UserClass maintain a count of their instances in existence,
// the number of defaut and copy ctor calls, assignment operators, and
// the number of calls to operator==() and operator<()
struct _TEST_EXPORT UserClass
{
UserData data_;
const int id_; // a unique non-zero id of the object
int origin_; // id of the original object that this
// is a (perhaps indirect) copy of (id_
// when this is the original)
int src_id_; // id of the object that this is a direct
// copy of (id_ when this the original)
// number of times the object has been copied into another object,
// regardless of whether the operation threw an exception or not
_RWSTD_SIZE_T n_copy_ctor_;
// number of times the object's assignment operator has been invoked,
// regardless of whether the operation threw an exception or not
_RWSTD_SIZE_T n_op_assign_;
// number of times the object's operator+=() has been invoked,
// regardless of whether the operation threw an exception or not
_RWSTD_SIZE_T n_op_plus_assign_;
// number of times the object's operator-=() has been invoked,
// regardless of whether the operation threw an exception or not
_RWSTD_SIZE_T n_op_minus_assign_;
// number of times the object's operator*=() has been invoked,
// regardless of whether the operation threw an exception or not
_RWSTD_SIZE_T n_op_times_assign_;
// number of times the object's operator/=() has been invoked,
// regardless of whether the operation threw an exception or not
_RWSTD_SIZE_T n_op_div_assign_;
// number of times the object's operator== was invoked
// regardless of whether the operation threw an exception
_RWSTD_SIZE_T n_op_eq_;
// number of times the object's operator< was invoked
// regardless of whether the operation threw an exception
_RWSTD_SIZE_T n_op_lt_;
static _RWSTD_SIZE_T count_; // number of objects in existence (>= 0)
static int id_gen_; // generates a unique non-zero id
static int (*gen_)(); // extern "C++" int (*)()
static _RWSTD_SIZE_T n_total_def_ctor_; // number of default ctor calls
static _RWSTD_SIZE_T n_total_copy_ctor_; // ... copy ctors ...
static _RWSTD_SIZE_T n_total_dtor_; // ... dtors ...
static _RWSTD_SIZE_T n_total_op_assign_; // ... assignment operators ...
static _RWSTD_SIZE_T n_total_op_plus_assign_; // ... operator+=
static _RWSTD_SIZE_T n_total_op_minus_assign_; // ... operator-=
static _RWSTD_SIZE_T n_total_op_times_assign_; // ... operator*=
static _RWSTD_SIZE_T n_total_op_div_assign_; // ... operator/=
static _RWSTD_SIZE_T n_total_op_eq_; // ... equality operators ...
static _RWSTD_SIZE_T n_total_op_lt_; // ... operators <= ...
// classes thrown from the respective functions
struct Exception { int id_; };
struct DefCtor: Exception { };
struct CopyCtor: Exception { };
struct Dtor: Exception { };
struct OpAssign: Exception { };
struct OpPlusAssign: Exception { };
struct OpMinusAssign: Exception { };
struct OpTimesAssign: Exception { };
struct OpDivAssign: Exception { };
struct OpEq: Exception { };
struct OpLt: Exception { };
// throw object's `id' wrapped in the appropriate struct when the
// corresponding n_total_xxx_ counter reaches the value pointed to
// by the respective pointer below
static _RWSTD_SIZE_T* def_ctor_throw_ptr_;
static _RWSTD_SIZE_T* copy_ctor_throw_ptr_;
static _RWSTD_SIZE_T* dtor_throw_ptr_;
static _RWSTD_SIZE_T* op_assign_throw_ptr_;
static _RWSTD_SIZE_T* op_plus_assign_throw_ptr_;
static _RWSTD_SIZE_T* op_minus_assign_throw_ptr_;
static _RWSTD_SIZE_T* op_times_assign_throw_ptr_;
static _RWSTD_SIZE_T* op_div_assign_throw_ptr_;
static _RWSTD_SIZE_T* op_eq_throw_ptr_;
static _RWSTD_SIZE_T* op_lt_throw_ptr_;
// objects to which the pointers above initally point
static _RWSTD_SIZE_T def_ctor_throw_count_;
static _RWSTD_SIZE_T copy_ctor_throw_count_;
static _RWSTD_SIZE_T dtor_throw_count_;
static _RWSTD_SIZE_T op_assign_throw_count_;
static _RWSTD_SIZE_T op_plus_assign_throw_count_;
static _RWSTD_SIZE_T op_minus_assign_throw_count_;
static _RWSTD_SIZE_T op_times_assign_throw_count_;
static _RWSTD_SIZE_T op_div_assign_throw_count_;
static _RWSTD_SIZE_T op_eq_throw_count_;
static _RWSTD_SIZE_T op_lt_throw_count_;
UserClass ();
UserClass (const UserClass&);
~UserClass ();
UserClass& operator= (const UserClass&);
UserClass& operator+= (const UserClass&);
UserClass& operator-= (const UserClass&);
UserClass& operator*= (const UserClass&);
UserClass& operator/= (const UserClass&);
bool operator== (const UserClass&) const;
bool operator< (const UserClass&) const;
// the following operators are not declared or defined in order
// to detect any unwarranted assumptions made in algorithms
// bool operator!= (const UserClass &rhs) const;
// bool operator> (const UserClass &rhs) const;
// bool operator>= (const UserClass &rhs) const;
// bool operator<= (const UserClass &rhs) const;
// UserClass operator- () const;
// UserClass operator+ () const;
bool
is_count (_RWSTD_SIZE_T copy_ctor,
_RWSTD_SIZE_T op_assign,
_RWSTD_SIZE_T op_eq,
_RWSTD_SIZE_T op_lt) const;
static bool
is_total (_RWSTD_SIZE_T count,
_RWSTD_SIZE_T n_def_ctor,
_RWSTD_SIZE_T n_copy_ctor,
_RWSTD_SIZE_T n_op_assign,
_RWSTD_SIZE_T n_op_eq,
_RWSTD_SIZE_T n_op_lt);
// returns a pointer to the first element in the sequence whose value
// is less than the value of the immediately preceding element, or 0
// when no such element exists
static const UserClass*
first_less (const UserClass*, _RWSTD_SIZE_T);
static void reset_totals ();
static UserClass
from_char (char c)
{
UserClass x;
x.data_.val_ = c;
return x;
}
// construct an array of objects of type UserClass each initialized
// from the corresponding element of the character array
// when the last argument is true and the character array
// is not sorted in ascending order the function fails by
// returning 0
static UserClass*
from_char (const char*, _RWSTD_SIZE_T = _RWSTD_SIZE_MAX,
bool = false);
// returns -1 when less, 0 when same, or +1 when the array
// of UserClass objects is greater than the character string
static int compare (const UserClass*, const char*,
_RWSTD_SIZE_T = _RWSTD_SIZE_MAX);
static int compare (const char*, const UserClass*,
_RWSTD_SIZE_T = _RWSTD_SIZE_MAX);
// returns -1 when less, 0 when same, or +1 when the first
// array of UserClass objects is greater than the second array
static int compare (const UserClass*, const UserClass*, _RWSTD_SIZE_T);
// returns a pointer to the first element in the sequence of UserClass
// whose value is not equal to the corresponding element of
// the character string or 0 when no such element exists
static const UserClass* mismatch (const UserClass*, const char*,
_RWSTD_SIZE_T);
struct Less;
private:
enum assign_op {
op_assign, op_plus_assign, op_minus_assign,
op_times_assign, op_div_assign
};
void assign (assign_op, const UserClass&);
};
/**************************************************************************/
struct _TEST_EXPORT UnaryPredicate
{
// total number of times operator() was invoked
static _RWSTD_SIZE_T n_total_op_fcall_;
UnaryPredicate ();
UnaryPredicate (const UnaryPredicate&);
UnaryPredicate& operator= (const UnaryPredicate&);
virtual ~UnaryPredicate ();
virtual conv_to_bool operator()(const UserClass&) const;
};
struct _TEST_EXPORT BinaryPredicate
{
// total number of times operator() was invoked
static _RWSTD_SIZE_T n_total_op_fcall_;
enum binary_op {
op_equals,
op_not_equals,
op_less,
op_less_equal,
op_greater,
op_greater_equal
};
BinaryPredicate (binary_op);
virtual ~BinaryPredicate ();
virtual conv_to_bool operator()(const UserClass&,
const UserClass&) /* non-const */;
private:
// not assignable
void operator= (const BinaryPredicate&);
binary_op op_;
};
struct UserClass::Less: BinaryPredicate
{
// dummy arguments provided to prevent the class from being
// default constructible and implicit conversion from int
Less (int /* dummy */, int /* dummy */)
: BinaryPredicate (BinaryPredicate::op_less) { /* no-op */ }
};
static const struct _TEST_EXPORT UserClassFmatInit {
UserClassFmatInit ();
} _rw_user_class_fmat_init;
#endif // RW_VALUE_H_INCLUDED