1 #ifndef CORELIB___NCBIMISC__HPP
2 #define CORELIB___NCBIMISC__HPP
40 #ifdef HAVE_SYS_TYPES_H
41 # include <sys/types.h>
44 #if !defined(HAVE_NULLPTR) && !defined(nullptr)
55 #ifndef NCBI_ESWITCH_DEFINED
56 #define NCBI_ESWITCH_DEFINED
81 #ifndef NCBI_EOWNERSHIP_DEFINED
82 #define NCBI_EOWNERSHIP_DEFINED
180 #define DECLARE_SAFE_BOOL_METHOD(Expr) \
181 struct SSafeBoolTag { \
182 void SafeBoolTrue(SSafeBoolTag*) {} \
184 typedef void (SSafeBoolTag::*TBoolType)(SSafeBoolTag*); \
185 operator TBoolType() const { \
186 return (Expr)? &SSafeBoolTag::SafeBoolTrue: 0; \
189 bool operator==(TBoolType) const; \
190 bool operator!=(TBoolType) const; \
192 friend struct SSafeBoolTag
199 #define DECLARE_OPERATOR_BOOL(Expr) \
200 DECLARE_SAFE_BOOL_METHOD(Expr)
206 #define DECLARE_OPERATOR_BOOL_PTR(Ptr) \
207 DECLARE_OPERATOR_BOOL((Ptr) != 0)
213 #define DECLARE_OPERATOR_BOOL_REF(Ref) \
214 DECLARE_OPERATOR_BOOL((Ref).NotNull())
220 #define OVERRIDE_OPERATOR_BOOL(TAncestorClass, NewBoolExpr) \
221 using TAncestorClass::TBoolType; \
222 using TAncestorClass::SSafeBoolTag; \
223 operator TBoolType() const { \
224 return (NewBoolExpr)? & SSafeBoolTag::SafeBoolTrue : 0; \
244 template<
class Base,
class Member>
289 if (
static_cast<void*
>(&
first()) !=
static_cast<void*
>(&
second())){
308 template <
class TEnum>
319 operator TEnum ()
const {
return TEnum(
m_Value); }
332 operator unsigned int()
const;
399 template<
class X,
class Del = Deleter<X> >
525 template<
class X,
class Del = ArrayDeleter<X> >
638 #ifdef __cpp_using_enum
655 template <
class TValue>
671 template <
class TValue,
class TNullToValue = SThrowOnNull<TValue> >
695 operator TValue(
void)
const
706 const_cast<TValue&
>(
m_Value) = TNullToValue()();
716 *
this = TNullToValue()();
740 template <
class TValue,
class TNullToValue = SThrowOnNull<TValue> >
743 return (l.
IsNull() &&
r.IsNull()) ||
746 template <
class TValue,
class TNullToValue = SThrowOnNull<TValue> >
786 template<
typename Type>
791 #define ITERATE_CONST(Cont) NCBI_NS_NCBI::s_ITERATE_ConstRef(Cont)
795 template<
typename Type>
798 return &obj1 == &obj2;
800 # define ITERATE_BEGIN(Cont, Begin) \
801 (NCBI_ASSERT_EXPR(NCBI_NS_NCBI::s_ITERATE_SameObject(Cont, Cont), \
802 "rvalue container in *ITERATE"), (Cont).Begin())
804 # define ITERATE_BEGIN(Cont, Begin) ((Cont).Begin())
808 #if 0 && defined(NCBI_HAVE_CXX11)
809 # define ITERATE_VAR(Type) auto
811 # define ITERATE_VAR(Type) Type
815 #define ITERATE(Type, Var, Cont) \
816 for ( ITERATE_VAR(Type::const_iterator) \
817 Var = ITERATE_BEGIN(ITERATE_CONST(Cont), begin), \
818 NCBI_NAME2(Var,_end) = ITERATE_CONST(Cont).end(); \
819 Var != NCBI_NAME2(Var,_end); ++Var )
822 #define NON_CONST_ITERATE(Type, Var, Cont) \
823 for ( ITERATE_VAR(Type::iterator) Var = ITERATE_BEGIN(Cont, begin); \
824 Var != (Cont).end(); ++Var )
827 #define REVERSE_ITERATE(Type, Var, Cont) \
828 for ( ITERATE_VAR(Type::const_reverse_iterator) \
829 Var = ITERATE_BEGIN(ITERATE_CONST(Cont), rbegin), \
830 NCBI_NAME2(Var,_end) = ITERATE_CONST(Cont).rend(); \
831 Var != NCBI_NAME2(Var,_end); ++Var )
834 #define NON_CONST_REVERSE_ITERATE(Type, Var, Cont) \
835 for ( ITERATE_VAR(Type::reverse_iterator) \
836 Var = ITERATE_BEGIN(Cont, rbegin); \
837 Var != (Cont).rend(); ++Var )
843 #define ERASE_ITERATE(Type, Var, Cont) \
844 for ( ITERATE_VAR(Type::iterator) Var = ITERATE_BEGIN(Cont, begin), \
845 NCBI_NAME2(Var,_next) = Var; \
846 (Var = NCBI_NAME2(Var,_next)) != (Cont).end() && \
847 (++NCBI_NAME2(Var,_next), true); )
852 #define VECTOR_ERASE(Var, Cont) (NCBI_NAME2(Var,_next) = (Cont).erase(Var))
861 #define ITERATE_BOTH_BOOL_VALUES(BoolVar) \
862 for( bool BoolVar##BOTH_BOOL_VALUES_DONE##__LINE__ = false, BoolVar = false; ! BoolVar##BOTH_BOOL_VALUES_DONE##__LINE__ ; BoolVar##BOTH_BOOL_VALUES_DONE##__LINE__ = BoolVar, BoolVar = true )
865 #define ITERATE_0_IDX(idx, up_to) \
866 for( TSeqPos idx = 0; idx < up_to; ++idx )
869 #define ITERATE_SIMPLE(num_iters) \
870 ITERATE_0_IDX( _dummy_idx_94768308_##__LINE__, num_iters )
891 template<
class TKey,
class TStorage>
925 #if !defined(NCBI_TEST_APPLICATION)
937 operator T(
void)
const {
return static_cast<T>(
m_Id); }
944 template<
class TKey,
class TStorage>
948 return out <<
id.Get();
951 template<
class TKey,
class TStorage>
970 #if defined(NCBI_INT4_GI)
972 # error "Both NCBI_INT4_GI and NCBI_INT8_GI must not be defined!"
974 # ifdef NCBI_STRICT_GI
975 # error "Both NCBI_INT4_GI and NCBI_STRICT_GI must not be defined!"
977 #elif !defined(NCBI_INT8_GI)
978 # define NCBI_INT8_GI
981 #ifdef NCBI_TEST_STRICT_ENTREZ_ID
983 #define NCBI_STRICT_ENTREZ_ID
986 # ifdef NCBI_STRICT_ENTREZ_ID
987 # undef NCBI_STRICT_ENTREZ_ID
991 #ifndef NCBI_STRICT_GI
992 # undef NCBI_STRICT_ENTREZ_ID
993 # undef NCBI_STRICT_TAX_ID
1023 #ifdef NCBI_STRICT_GI
1038 #ifdef NCBI_STRICT_ENTREZ_ID
1045 #ifdef NCBI_STRICT_TAX_ID
1053 template<
class TId, TId
id>
1056 #ifndef NCBI_COMPILER_MSVC
1061 static const TId
value = id;
1065 #ifdef NCBI_STRICT_GI
1068 #define STRICT_ID_TO(TId, TInt, id) (static_cast<TInt>((id).Get()))
1069 #define STRICT_ID_FROM(TIdType, TIntType, id) (TIdType(static_cast<TIdType::TId>(id)))
1070 #define STRICT_ID_CONST(type, id) \
1071 (type(static_cast<type::TId>(ncbi::CConstIdChecker<type::TId, id>::value)))
1072 #define STRICT_ID_ZERO(type) STRICT_ID_CONST(type, 0)
1073 #define STRICT_ID_INVALID(type) STRICT_ID_CONST(type, -1)
1077 #define STRICT_ID_TO(TId, TInt, id) (static_cast<TInt>(id))
1078 #define STRICT_ID_FROM(TIdType, TIntType, id) (static_cast<TIdType>(id))
1079 #define STRICT_ID_CONST(type, id) (ncbi::CConstIdChecker<type, id>::value)
1080 #define STRICT_ID_ZERO(type) type(0)
1081 #define STRICT_ID_INVALID(type) type(-1)
1085 #define GI_TO(T, gi) STRICT_ID_TO(ncbi::TGi, T, gi)
1086 #define GI_FROM(T, value) STRICT_ID_FROM(ncbi::TGi, T, value)
1087 #define GI_CONST(gi) STRICT_ID_CONST(ncbi::TGi, gi)
1088 #define ZERO_GI STRICT_ID_ZERO(ncbi::TGi)
1089 #define INVALID_GI STRICT_ID_INVALID(ncbi::TGi)
1092 #ifdef NCBI_STRICT_ENTREZ_ID
1093 # define ENTREZ_ID_TO(T, entrez_id) STRICT_ID_TO(ncbi::TEntrezId, T, entrez_id)
1094 # define ENTREZ_ID_FROM(T, value) STRICT_ID_FROM(ncbi::TEntrezId, T, value)
1095 # define ENTREZ_ID_CONST(id) STRICT_ID_CONST(ncbi::TEntrezId, id)
1097 # define ENTREZ_ID_TO(T, entrez_id) (static_cast<T>(entrez_id))
1098 # define ENTREZ_ID_FROM(T, value) (static_cast<ncbi::TEntrezId>(value))
1099 # define ENTREZ_ID_CONST(id) id
1102 #define ZERO_ENTREZ_ID ENTREZ_ID_CONST(0)
1103 #define INVALID_ENTREZ_ID ENTREZ_ID_CONST(-1)
1105 #ifdef NCBI_STRICT_TAX_ID
1106 # define TAX_ID_TO(T, tax_id) STRICT_ID_TO(ncbi::TTaxId, T, tax_id)
1107 # define TAX_ID_FROM(T, value) STRICT_ID_FROM(ncbi::TTaxId, T, value)
1108 # define TAX_ID_CONST(id) STRICT_ID_CONST(ncbi::TTaxId, id)
1110 # define TAX_ID_TO(T, tax_id) (static_cast<T>(tax_id))
1111 # define TAX_ID_FROM(T, value) (static_cast<ncbi::TTaxId>(value))
1112 # define TAX_ID_CONST(id) id
1115 #define ZERO_TAX_ID TAX_ID_CONST(0)
1116 #define INVALID_TAX_ID TAX_ID_CONST(-1)
1120 #define INT_ID_TO(T, id) (static_cast<T>(id))
1121 #define INT_ID_FROM(T, value) (static_cast<ncbi::TIntId>(value))
1139 return static_cast<char*
> (object) +
offset;
1145 return static_cast<const char*
> (object) +
offset;
1152 (
static_cast<const char*
> (
first) -
static_cast<const char*
> (second));
1164 template <
size_t KEmbeddedSize,
class TType =
char>
1206 #if defined(NCBI_COMPILER_MSVC) || defined(NCBI_COMPILER_VISUALAGE)
1207 # define NCBI_DEPRECATED_CTOR(decl) NCBI_DEPRECATED decl
1209 # define NCBI_DEPRECATED_CTOR(decl) decl NCBI_DEPRECATED
1215 #define NCBI_DEPRECATED_CLASS NCBI_DEPRECATED_CTOR(class)
1218 #ifdef NCBI_ENABLE_SAFE_FLAGS
1249 template<
class Enum>
1278 return get() ==
b.get();
1282 return get() !=
b.get();
1338 #define DECLARE_SAFE_FLAGS_TYPE(E, T) \
1339 typedef NCBI_NS_NCBI::CSafeFlags<E> T
1346 #define DECLARE_SAFE_FLAGS(E) \
1347 inline NCBI_NS_NCBI::CSafeFlags<E> operator|(E a, E b) \
1348 { return NCBI_NS_NCBI::CSafeFlags<E>(a) | b; } \
1349 inline NCBI_NS_NCBI::CSafeFlags<E> operator&(E a, E b) \
1350 { return NCBI_NS_NCBI::CSafeFlags<E>(a) & b; } \
1351 inline NCBI_NS_NCBI::CSafeFlags<E> operator^(E a, E b) \
1352 { return NCBI_NS_NCBI::CSafeFlags<E>(a) ^ b; } \
1353 inline NCBI_NS_NCBI::CSafeFlags<E> operator~(E a) \
1354 { return ~NCBI_NS_NCBI::CSafeFlags<E>(a); }
1371 template<
class E>
inline
1379 # define DECLARE_SAFE_FLAGS_TYPE(Enum,Typedef) typedef underlying_type<Enum>::type Typedef
1380 # define DECLARE_SAFE_FLAGS(Enum) NCBI_EAT_SEMICOLON(safe_flags)
1403 catch (exception& e) {
1404 ERR_POST(
"Error executing action: " << e.what());
1447 template <
class T,
typename TDeleter>
1469 #define NCBI_EXPORT_FUNC_DECLARE(lib, func) \
1470 namespace NCBI_ ## lib \
1472 namespace S ## func \
1474 using T = decltype(func); \
1476 NCBI_ ## lib ## _EXPORT T* F(); \
1478 template <class T> \
1481 template <class TR, class... TArgs> \
1482 struct S<TR (TArgs...)> \
1484 static TR Call(TArgs... args) { return F()(args...); } \
1488 constexpr auto func = S ## func::S<S ## func::T>::Call; \
1491 #define NCBI_EXPORT_FUNC_DEFINE(lib, func) \
1492 namespace NCBI_ ## lib \
1494 namespace S ## func \
1496 T* F() { return ::func; } \
1506 template<
class T1,
class T2>
1508 void swap(NCBI_NS_NCBI::pair_base_member<T1,T2>& pair1,
1509 NCBI_NS_NCBI::pair_base_member<T1,T2>& pair2)
1515 template<
class P,
class D>
1517 void swap(NCBI_NS_NCBI::AutoPtr<P,D>& ptr1,
1518 NCBI_NS_NCBI::AutoPtr<P,D>& ptr2)
1524 #if defined(NCBI_COMPILER_WORKSHOP) || defined(NCBI_COMPILER_MIPSPRO)
1526 #define ArraySize(array) (sizeof(array)/sizeof((array)[0]))
1530 template<
class Element,
size_t Size>
1537 #ifdef NCBI_STRICT_GI
1540 size_t operator()(
const ncbi::CStrictId<TKey, TStorage> & x)
const
Template used to replace bool type arguments with some strict equivalent.
a helper template to enforce constness of argument to GI_CONST macro
CNcbiActionGuard class Executes registered callbacks on request or on destruction.
Template class allowing to store a value or null (unassigned) state.
Support for safe enum flags.
Template class for strict ID types.
definition of a Culling tree
Template used for empty base class optimization.
static DLIST_TYPE *DLIST_NAME() first(DLIST_LIST_TYPE *list)
std::ofstream out("events_result.xml")
main entry point for tests
element_type * m_Ptr
Internal pointer representation.
TValue operator()(void) const
virtual ~CNcbiActionGuard(void)
SStrictId_Entrez::TId TEntrezId
TEntrezId type for entrez ids which require the same strictness as TGi.
const Type & s_ITERATE_ConstRef(const Type &obj)
NCBI_XNCBI_EXPORT void g_ThrowOnNull(void)
Del deleter_type
Alias for template argument.
#define DECLARE_OPERATOR_BOOL(Expr)
Declaration of safe bool operator from boolean expression.
~AutoPtr(void)
Destructor.
CNcbiActionGuard & operator=(const CNcbiActionGuard &)
ETriState
Enumeration to represent a tristate value.
CSafeFlags operator~() const
AutoPtr< X, Del > & operator=(const AutoPtr< X, Del > &p)
Assignment operator.
CNcbiOstream & operator<<(CNcbiOstream &out, const CStrictId< TKey, TStorage > &id)
void AddAction(TFunc func)
element_type & operator[](size_t pos)
Array style dereference (returns reference)
CAction_Base & operator=(const CAction_Base &)
X element_type
Define element type.
CSafeFlags & operator|=(const CSafeFlags &b)
enum ENcbiSwitch ESwitch
Aux.
CStrictId(T id, typename enable_if< is_same< T, TId >::value, T >::type=0)
element_type * x_Release(void) const
Release for const object.
void reset(element_type *p=0, EOwnership ownership=eTakeOwnership)
Reset will delete the old pointer (if owned), set content to the new value, and assume the ownership ...
void ExecuteActions(void)
bool operator!=(const CNullable< TValue, TNullToValue > &l, const CNullable< TValue, TNullToValue > &r)
char * strdup(const char *str)
Supply string duplicate function, if one is not defined.
AutoPtr(const AutoPtr< X, Del > &p)
Copy constructor.
bool operator==(const CSafeFlags &b) const
CSafeFlags operator&(const CSafeFlags &b) const
pair_base_member(const first_type &first_value, const second_type &second_value)
ERetriable
Can the action be retried?
void Swap(AutoPtr< X, Del > &a)
CAction_Base(const CAction_Base &)
void Swap(pair_base_member< first_type, second_type > &p)
pair_base_member< deleter_type, bool > m_Data
State info.
AutoArray< X, Del > & operator=(element_type *p)
Assignment operator.
CSafeFlags< E > operator|(E a, CSafeFlags< E > b)
Helper operators for safe-flags enums.
bool operator!=(const CSafeFlags &b) const
bool operator<(const TThis &id) const
element_type & operator*(void) const
Dereference operator.
CSafeFlags operator|(const CSafeFlags &b) const
AutoArray< X, Del > & operator=(const AutoArray< X, Del > &p)
Assignment operator.
TThis operator-(const TThis &id) const
static ssize_t Sub(const void *first, const void *second)
calculate offset inside object
const first_type & first() const
bool IsNull(void) const
Check if the object is unassigned.
element_type * operator->(void) const
Reference operator.
CFastBuffer(size_t buf_size)
CNcbiActionGuard(const CNcbiActionGuard &)
void Execute(void) const override
X element_type
Define element type.
ERound
Whether to truncate/round a value.
TThis & operator=(const TThis &other)
static void * Add(void *object, ssize_t offset)
add offset to object reference (to get object's member)
element_type * x_Release(void) const
Release for const object.
unsigned int TSeqPos
Type for sequence locations and lengths.
void Swap(AutoPtr< X, Del > &a)
bool operator==(const TThis &id) const
bool operator<=(const TThis &id) const
CSafeFlags operator^(const CSafeFlags &b) const
constexpr size_t ArraySize(const Element(&)[Size])
CNullable(TValue value)
Initialize nullable with a specific value.
unique_ptr< T, void(*)(T *)> c_unique_ptr
Template helpers for unique_ptr to work with resource allocating/deallocating C functions.
AutoArray(size_t size)
Construct the array using C++ new[] operator.
CStrictId< TKey, TStorage > TThis
size_t operator()(const ncbi::CStrictId< TKey, TStorage > &x) const
TType m_EmbeddedBuffer[KEmbeddedSize]
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
const element_type & operator[](size_t pos) const
Array style dereference (returns value)
ENormalizePath
Whether to normalize a path.
pair_base_member< deleter_type, bool > m_Data
State info.
bool s_ITERATE_SameObject(const Type &obj1, const Type &obj2)
CSafeFlags & operator^=(const CSafeFlags &b)
CNullable(ENull=null)
Create an empty nullable.
AutoArray(const AutoArray< X, Del > &p)
underlying_type< enum_type >::type storage_type
bool operator>=(const TThis &id) const
int TSignedSeqPos
Type for signed sequence position.
element_type * get(void) const
Get pointer.
AutoArray(element_type *p, const deleter_type &deleter)
static X * Create(void)
Default create function.
AutoPtr(element_type *p=0)
Constructor.
bool operator==(const CNullable< TValue, TNullToValue > &l, const CNullable< TValue, TNullToValue > &r)
enum ENcbiOwnership EOwnership
Ownership relations between objects.
const TType * begin(void) const
TValue & SetValue(void)
Get a non-const reference to the value.
static void Delete(X *object)
Array delete function.
EFollowLinks
Whether to follow symbolic links (also known as shortcuts or aliases)
TType operator[](size_t pos) const
CSafeFlags(enum_type flags)
CStrictId< SStrictId_Gi, SStrictId_Gi::TId > TGi
static void Delete(X *object)
Default delete function.
TType * operator+(size_t offset)
unique_ptr< T, TDeleter > make_c_unique(T *p, TDeleter d)
Eliminates the necessity for specifying types of both allocated resource and deallocating C function.
CStrictId(const TThis &other)
TThis operator+(const TThis &id) const
SStrictId_Tax::TId TTaxId
Taxon id type.
Del deleter_type
Alias for template argument.
AutoArray(element_type *p=0)
EInterruptOnSignal
Interrupt on signal mode.
CSafeFlags & operator&=(const CSafeFlags &b)
CNcbiIstream & operator>>(CNcbiIstream &in, CStrictId< TKey, TStorage > &id)
AutoPtr< X, Del > & operator=(element_type *p)
Assignment operator.
static void Delete(X *object)
C Language deallocation function.
bool operator==(int v) const
BEGIN_NCBI_NAMESPACE
NCBI_EOWNERSHIP_DEFINED.
CSafeFlags(storage_type flags)
#define DECLARE_OPERATOR_BOOL_PTR(Ptr)
Declaration of safe bool operator from pointer expression.
AutoPtr(element_type *p, const deleter_type &deleter)
Constructor.
CSafeFlags< E > operator&(E a, CSafeFlags< E > b)
CSafeFlags< E > operator^(E a, CSafeFlags< E > b)
AutoPtr(element_type *p, EOwnership ownership)
Constructor, own the pointed object if ownership == eTakeOwnership.
const TSeqPos kInvalidSeqPos
Define special value for invalid sequence position.
CNullable & operator=(TValue value)
Assign a value to the nullable.
ENullable
Whether a value is nullable.
element_type * get(void) const
Get pointer.
TThis operator-(void) const
list< unique_ptr< CAction_Base > > TActions
bool operator!=(int v) const
const second_type & second() const
void swap(NCBI_NS_NCBI::pair_base_member< T1, T2 > &pair1, NCBI_NS_NCBI::pair_base_member< T1, T2 > &pair2)
virtual void Execute(void) const =0
element_type * release(void)
Release will release ownership of pointer to caller.
ESign
Signedness of a value.
element_type * release(void)
Release will release ownership of pointer to caller.
bool operator!=(const TThis &id) const
void reset(element_type *p=0)
Reset will delete the old pointer, set content to the new value, and assume the ownership upon the ne...
bool operator>(const TThis &id) const
pair_base_member(const member_type &member_value)
const TValue & GetValue(void) const
Get a const reference to the current value.
const TType * end(void) const
AutoPtr(element_type *p, const deleter_type &deleter, EOwnership ownership)
Constructor, own the pointed object if ownership == eTakeOwnership.
@ eTriState_False
The value is equivalent to false/no.
@ eTriState_True
The value is equivalent to true/yes.
@ eTriState_Unknown
The value is indeterminate.
@ eRetriable_Unknown
It is unknown if the action can succeed if retried.
@ eRetriable_No
It makes no sense to retry the action.
@ eRetriable_Yes
It makes sense to try again.
@ eTrunc
Value must be truncated.
@ eRound
Value must be rounded.
@ eNormalizePath
Normalize a path.
@ eNotNormalizePath
Do not normalize a path.
@ eIgnoreLinks
Do not follow symbolic links.
@ eFollowLinks
Follow symbolic links.
@ eRestartOnSignal
Restart operation if interrupted by a signal.
@ eInterruptOnSignal
Cancel operation if interrupted by a signal.
@ eNotNullable
Value cannot be null.
@ eNullable
Value can be null.
@ eNegative
Value is negative.
@ ePositive
Value is positive.
@ eTakeOwnership
No ownership assumed.
#define ERR_POST(message)
Error posting with file, line number information but without error codes.
int32_t Int4
4-byte (32-bit) signed integer
uint32_t Uint4
4-byte (32-bit) unsigned integer
int64_t Int8
8-byte (64-bit) signed integer
uint64_t Uint8
8-byte (64-bit) unsigned integer
IO_PREFIX::ostream CNcbiOstream
Portable alias for ostream.
IO_PREFIX::istream CNcbiIstream
Portable alias for istream.
enum ENcbiOwnership EOwnership
Ownership relations between objects.
ENcbiOwnership
Ownership relations between objects.
#define NCBI_XNCBI_EXPORT
unsigned int
A callback function used to compare two keys in a database.
const struct ncbi::grid::netcache::search::fields::SIZE size
Magic spell ;-) needed for some weird compilers... very empiric.
NCBI C++ auxiliary debug macros.
std::istream & in(std::istream &in_, double &x_)
double r(size_t dimension_, const Int4 *score_, const double *prob_, double theta_)
static const char * str(char *buf, int n)
Functor template for deleting array of objects.
Functor template for the C language deallocation function, free().
Functor template for allocating object.
Functor template for deleting object.
Key structs must always be defined - they are used in aliasinfo.cpp.