/* Copyright 2012. Bloomberg Finance L.P.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions: The above
* copyright notice and this permission notice shall be included in all copies
* or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
// blpapi_constant.h -*-C++-*-
#ifndef INCLUDED_BLPAPI_CONSTANT
#define INCLUDED_BLPAPI_CONSTANT
//@PURPOSE: Provide a representation for schema-level enumeration constants.
//
//@CLASSES:
// blpapi::Constant: schema enumeration constant
// blpapi::ConstantList: list of schema enumeration constants
//
//@SEE_ALSO: blpapi_schema
//
//@DESCRIPTION: This component provides a representation of a schema
// enumeration constant, and a representation for lists of such constants.
#ifndef INCLUDED_BLPAPI_TYPES
#include <blpapi_types.h>
#endif
#ifndef INCLUDED_BLPAPI_NAME
#include <blpapi_name.h>
#endif
#ifndef INCLUDED_BLPAPI_DEFS
#include <blpapi_defs.h>
#endif
#ifndef INCLUDED_BLPAPI_DATETIME
#include <blpapi_datetime.h>
#endif
#ifndef INCLUDED_BLPAPI_EXCEPTION
#include <blpapi_exception.h>
#endif
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
BLPAPI_EXPORT
void blpapi_Constant_setUserData(
blpapi_Constant_t *constant,
void * userdata);
BLPAPI_EXPORT
blpapi_Name_t* blpapi_Constant_name(
const blpapi_Constant_t *constant);
BLPAPI_EXPORT
const char* blpapi_Constant_description(
const blpapi_Constant_t *constant);
BLPAPI_EXPORT
int blpapi_Constant_status(
const blpapi_Constant_t *constant);
BLPAPI_EXPORT
int blpapi_Constant_datatype(
const blpapi_Constant_t *constant);
BLPAPI_EXPORT
int blpapi_Constant_getValueAsChar(
const blpapi_Constant_t *constant,
blpapi_Char_t *buffer);
BLPAPI_EXPORT
int blpapi_Constant_getValueAsInt32(
const blpapi_Constant_t *constant,
blpapi_Int32_t *buffer);
BLPAPI_EXPORT
int blpapi_Constant_getValueAsInt64(
const blpapi_Constant_t *constant,
blpapi_Int64_t *buffer);
BLPAPI_EXPORT
int blpapi_Constant_getValueAsFloat32(
const blpapi_Constant_t *constant,
blpapi_Float32_t *buffer);
BLPAPI_EXPORT
int blpapi_Constant_getValueAsFloat64(
const blpapi_Constant_t *constant,
blpapi_Float64_t *buffer);
BLPAPI_EXPORT
int blpapi_Constant_getValueAsDatetime(
const blpapi_Constant_t *constant,
blpapi_Datetime_t *buffer);
BLPAPI_EXPORT
int blpapi_Constant_getValueAsString(
const blpapi_Constant_t *constant,
const char **buffer);
BLPAPI_EXPORT
void * blpapi_Constant_userData(
const blpapi_Constant_t *constant);
BLPAPI_EXPORT
void blpapi_ConstantList_setUserData(
blpapi_ConstantList_t *constant,
void * userdata);
BLPAPI_EXPORT
blpapi_Name_t* blpapi_ConstantList_name(
const blpapi_ConstantList_t *list);
BLPAPI_EXPORT
const char* blpapi_ConstantList_description(
const blpapi_ConstantList_t *list);
BLPAPI_EXPORT
int blpapi_ConstantList_numConstants(
const blpapi_ConstantList_t *list);
BLPAPI_EXPORT
int blpapi_ConstantList_datatype(
const blpapi_ConstantList_t *constant);
BLPAPI_EXPORT
int blpapi_ConstantList_status(
const blpapi_ConstantList_t *list);
BLPAPI_EXPORT
blpapi_Constant_t* blpapi_ConstantList_getConstant(
const blpapi_ConstantList_t *constant,
const char *nameString,
const blpapi_Name_t *name);
BLPAPI_EXPORT
blpapi_Constant_t* blpapi_ConstantList_getConstantAt(
const blpapi_ConstantList_t *constant,
size_t index);
BLPAPI_EXPORT
void * blpapi_ConstantList_userData(
const blpapi_ConstantList_t *constant);
#ifdef __cplusplus
}
namespace BloombergLP {
namespace blpapi {
// ==============
// class Constant
// ==============
class Constant {
// Represents the value of a schema enumeration constant.
//
// Constants can be any of the following DataTypes: BOOL, CHAR, BYTE,
// INT32, INT64, FLOAT32, FLOAT64, STRING, DATE, TIME, DATETIME. This class
// provides access to not only the constant value, but also the symbolic
// name, the description, and the status of the constant. It also provides
// an interface for associating arbitrary user-defined data (specified as
// a 'void*') with a 'Constant'.
//
// 'Constant' objects are read-only, with the exception of a single
// 'void*' attribute for storing user data. 'Constant' objects have
// *reference* *semantics* with respect to this user data field: calling
// 'c.setUserData(void*)' modifies the user data associated with 'c', as
// well as that associated with all copies of 'c'. As a result, functions
// which set or read this field are *NOT* per-object thread-safe. Clients
// must syncrhonize such operations across *all* *copies* of an object.
//
// Application clients need never create fresh 'Constant' objects directly;
// applications will typically work with copies of objects returned by
// other 'blpapi' components.
blpapi_Constant_t *d_impl_p;
public:
// CREATORS
Constant(blpapi_Constant_t *handle);
Constant(const Constant& original);
// Create a 'Constant' object having the same value as the specified
// 'original'. Note that this function does *not* require cross-object
// thread synchronization, as it does not directly read or modify the
// 'userData' field.
// MANIPULATORS
void setUserData(void *userData);
// Set the user data associated with this 'Constant' -- and all copies
// of this 'Constant' -- to the specified 'userData'. Clients are
// responsible for synchronizing calls to this function, and to
// 'userData()', across all copies of this 'Constant' object.
// ACCESSORS
Name name() const;
// Return the symbolic name of this 'Constant'.
const char *description() const;
// Return a null-terminated string containing a human-readable
// description of this 'Constant'. The returned pointer remains valid
// until this 'Constant' is destroyed.
int status() const;
// Return the status, as a 'SchemaStatus::Value', of this 'Constant'.
int datatype() const;
// Return the data type used to represent the value of this constant as
// an integer specified by the 'blpapi_DataType_t' enumeration defined
// in 'blpapi_types'.
int getValueAs(char *buffer) const;
// Load the 'char' value of this 'Constant' into the specified 'buffer'
// and return 0; if this 'Constant' cannot be converted into a 'char'
// then return a nonzero value and leave 'buffer' unchanged.
int getValueAs(Int32 *buffer) const;
// Load the 'Int32' value of this 'Constant' into the specified
// 'buffer' and return 0; if this 'Constant' cannot be converted into
// an 'Int32' then return a nonzero value and leave 'buffer' unchanged.
int getValueAs(Int64 *buffer) const;
// Load the 'Int64' value of this 'Constant' into the specified
// 'buffer' and return 0; if this 'Constant' cannot be converted into
// an 'Int64' then return a nonzero value and leave 'buffer' unchanged.
int getValueAs(Float32 *buffer) const;
// Load the 'Float32' value of this 'Constant' into the specified
// 'buffer' and return 0; if this 'Constant' cannot be converted into a
// 'Float32' then return a nonzero value and leave 'buffer' unchanged.
int getValueAs(Float64 *buffer) const;
// Load the 'Float64' value of this 'Constant' into the specified
// 'buffer' and return 0; if this 'Constant' cannot be converted into a
// 'Float64' then return a nonzero value and leave 'buffer' unchanged.
int getValueAs(Datetime *buffer) const;
// Load the 'Datetime' value of this 'Constant' into the specified
// 'buffer' and return 0; if this 'Constant' cannot be converted into a
// 'Datetime' then return a nonzero value and leave 'buffer' unchanged.
int getValueAs(std::string *buffer) const;
// Load the 'std::string' value of this 'Constant' into the specified
// 'buffer' and return 0; if this 'Constant' cannot be converted into a
// 'std::string' then return a nonzero value and leave 'buffer'
// unchanged.
char getValueAsChar() const;
// Return the value of this object as a 'char'. If the value cannot be
// converted to a 'char' an exception is thrown.
Int32 getValueAsInt32() const;
// Return the value of this object as an 'Int32'. If the value cannot
// be converted to an 'Int32' an exception is thrown.
Int64 getValueAsInt64() const;
// Return the value of this object as an 'Int64'. If the value cannot
// be converted to an 'Int64' an exception is thrown.
Float32 getValueAsFloat32() const;
// Return the value of this object as a 'Float32'. If the value cannot
// be converted to a 'Float32' an exception is thrown.
Float64 getValueAsFloat64() const;
// Return the value of this object as a 'Float64'. If the value cannot
// be converted to a 'Float64' an exception is thrown.
Datetime getValueAsDatetime() const;
// Return the value of this object as a 'Datetime'. If the value cannot
// be converted to a 'Datetime' an exception is thrown.
std::string getValueAsString() const;
// Return the value of this object as a 'std::string'. If the value
// cannot be converted to a 'std::string' an exception is thrown.
void *userData() const;
// Return the user data associated with this 'Constant'. If no user
// data has been associated with this 'Constant' then return 0. Clients
// are responsible for synchronizing calls to this function with calls
// to 'setUserData(void*)' made on not only this 'Constant', but also
// all copies of this 'Constant'. Note that 'Constant' objects have
// reference semantics: this function will reflect the last value set
// on *any* copy of this 'Constant'.
const blpapi_Constant_t *impl() const;
};
// ==================
// class ConstantList
// ==================
class ConstantList {
// Represents a list schema enumeration constants.
//
// As well as the list of 'Constant' objects, this class also provides
// access to the symbolic name, description, and status of the list as a
// whole, and provides a facility for associating arbitrary user data (in
// the form of a 'void*') with the list. All 'Constant' objects in a
// 'ConstantList' are of the same DataType.
//
// 'ConstantList' objects are read-only, with the exception of a single
// 'void*' attribute for storing user data. 'ConstantList' objects have
// *reference* *semantics* with respect to this user data field: calling
// 'c.setUserData(void*)' modifies the user data associated with 'c', as
// well as that associated with all copies of 'c'. As a result, functions
// which set or read this field are *NOT* per-object thread-safe. Clients
// must syncrhonize such operations across *all* *copies* of an object.
//
// Application clients need never create fresh 'ConstantList' objects
// directly; applications will typically work with copies of objects
// returned by other 'blpapi' components.
blpapi_ConstantList_t *d_impl_p;
public:
ConstantList(blpapi_ConstantList_t *handle);
ConstantList(const ConstantList& original);
// Create a 'ConstantList' object having the same value as the
// specified 'original'. Note that this function does *not* require
// cross-object thread synchronization, as it does not directly read or
// modify the 'userData' field.
// MANIPULATORS
void setUserData(void *userData);
// Set the user data associated with this 'ConstantList' -- and all
// copies of this 'ConstantList' -- to the specified 'userData'.
// Clients are responsible for syncrhonizing calls to this function,
// and to 'userData()', across all copies of this 'ConstantList'
// object.
// ACCESSORS
Name name() const;
// Return the symbolic name of this 'ConstantList'.
const char *description() const;
// Return a null-terminated string containing a human-readable
// description of this 'ConstantList'. The returned pointer remains
// valid until this 'ConstantList' is destroyed.
int status() const;
// Return the status, as a'SchemaStatus::Value', of this
// 'ConstantList'.
int numConstants() const;
// Return the number of 'Constant' objects contained in this
// 'ConstantList'.
int datatype() const;
// Return the data type used to represent the value of this constant as
// an integer specified by the 'blpapi_DataType_t' enumeration defined
// in 'blpapi_types'.
Constant getConstant(const Name& name) const;
// Return the 'Constant' in this 'ConstantList' identified by the
// specified 'name'. If this 'ConstantList' does not contain a
// 'Constant' with the specified 'name' then an exception is thrown.
Constant getConstant(const char *name) const;
// Return the 'Constant' in this 'ConstantList' identified by the
// specified 'name'. If this 'ConstantList' does not contain a
// 'Constant' with the specified 'name' then an exception is thrown.
Constant getConstantAt(size_t index) const;
// Return the 'Constant' at the specified 'index' in this
// 'ConstantList'. If 'index' is not in the range from 0 to
// 'numConstants() - 1' then an exception is thrown.
void *userData() const;
// Return the user data associated with this 'ConstantList'. If no user
// data has been associated with this 'ConstantList' then return 0.
// Clients are responsible for synchronizing calls to this function
// with calls to 'setUserData(void*)' made on not only this
// 'ConstantList', but also all copies of this 'ConstantList'. Note
// that 'ConstantList' objects have reference semantics: this function
// will reflect the last value set on *any* copy of this
// 'ConstantList'.
const blpapi_ConstantList_t *impl() const;
// Return the internal implementation.
};
//=============================================================================
// INLINE FUNCTION DEFINITIONS
//=============================================================================
inline
Constant::Constant(blpapi_Constant_t *handle)
: d_impl_p(handle)
{
}
inline
Constant::Constant(
const Constant& original)
: d_impl_p(original.d_impl_p)
{
}
inline
Name Constant::name() const
{
return blpapi_Constant_name(d_impl_p);
}
inline
const char *Constant::description() const
{
return blpapi_Constant_description(d_impl_p);
}
inline
int Constant::status() const
{
return blpapi_Constant_status(d_impl_p);
}
inline
int Constant::datatype() const
{
return blpapi_Constant_datatype(d_impl_p);
}
inline
const blpapi_Constant_t *Constant::impl() const
{
return d_impl_p;
}
inline
int Constant::getValueAs(char *buffer) const
{
return blpapi_Constant_getValueAsChar(d_impl_p, buffer);
}
inline
int Constant::getValueAs(Int32 *buffer) const
{
return blpapi_Constant_getValueAsInt32(d_impl_p, buffer);
}
inline
int Constant::getValueAs(Int64 *buffer) const
{
return blpapi_Constant_getValueAsInt64(d_impl_p, buffer);
}
inline
int Constant::getValueAs(Float32 *buffer) const
{
return blpapi_Constant_getValueAsFloat32(d_impl_p, buffer);
}
inline
int Constant::getValueAs(Float64 *buffer) const
{
return blpapi_Constant_getValueAsFloat64(d_impl_p, buffer);
}
inline
int Constant::getValueAs(Datetime *buffer) const
{
return blpapi_Constant_getValueAsDatetime(d_impl_p, &buffer->rawValue());
}
inline
int Constant::getValueAs(std::string *result) const
{
const char *buffer;
int rc = blpapi_Constant_getValueAsString(d_impl_p, &buffer);
if (!rc) {
*result = buffer;
}
return rc;
}
inline
char Constant::getValueAsChar() const
{
char value;
ExceptionUtil::throwOnError(getValueAs(&value));
return value;
}
inline
Int32 Constant::getValueAsInt32() const
{
int value;
ExceptionUtil::throwOnError(getValueAs(&value));
return value;
}
inline
Int64 Constant::getValueAsInt64() const
{
Int64 value;
ExceptionUtil::throwOnError(getValueAs(&value));
return value;
}
inline
float Constant::getValueAsFloat32() const
{
Float32 value;
ExceptionUtil::throwOnError(getValueAs(&value));
return value;
}
inline
double Constant::getValueAsFloat64() const
{
Float64 value;
ExceptionUtil::throwOnError(getValueAs(&value));
return value;
}
inline
Datetime Constant::getValueAsDatetime() const
{
Datetime value;
ExceptionUtil::throwOnError(getValueAs(&value));
return value;
}
inline
std::string Constant::getValueAsString() const
{
std::string value;
ExceptionUtil::throwOnError(getValueAs(&value));
return value;
}
inline
void Constant::setUserData(void *newUserData)
{
blpapi_Constant_setUserData(d_impl_p, newUserData);
}
inline
void *Constant::userData() const
{
return blpapi_Constant_userData(d_impl_p);
}
inline
ConstantList::ConstantList(
blpapi_ConstantList_t *handle)
: d_impl_p(handle)
{
}
inline
ConstantList::ConstantList(
const ConstantList& original)
: d_impl_p(original.d_impl_p)
{
}
inline
Name ConstantList::name() const
{
return blpapi_ConstantList_name(d_impl_p);
}
inline
const char* ConstantList::description() const
{
return blpapi_ConstantList_description(d_impl_p);
}
inline
int ConstantList::status() const
{
return blpapi_ConstantList_status(d_impl_p);
}
inline
int ConstantList::datatype() const
{
return blpapi_ConstantList_datatype(d_impl_p);
}
inline
int ConstantList::numConstants() const
{
return blpapi_ConstantList_numConstants(d_impl_p);
}
inline
Constant ConstantList::getConstant(const Name& constantName) const
{
return blpapi_ConstantList_getConstant(d_impl_p, 0, constantName.impl());
}
inline
Constant ConstantList::getConstant(const char *nameString) const
{
return blpapi_ConstantList_getConstant(d_impl_p, nameString, 0 );
}
inline
Constant ConstantList::getConstantAt(size_t index) const
{
return blpapi_ConstantList_getConstantAt(d_impl_p, index);
}
inline
const blpapi_ConstantList_t *ConstantList::impl() const
{
return d_impl_p;
}
inline
void ConstantList::setUserData(void *newUserData)
{
blpapi_ConstantList_setUserData(d_impl_p, newUserData);
}
inline
void *ConstantList::userData() const
{
return blpapi_ConstantList_userData(d_impl_p);
}
} // close namespace blpapi
} // close namespace BloombergLP
#endif // #ifndef __cplusplus
#endif // #ifndef INCLUDED_BLPAPI_CONSTANT