Status: inline trival and add maximize() w/ shorthand operator |=
This commit is contained in:
@@ -53,7 +53,7 @@ namespace epics { namespace pvData {
|
||||
/**
|
||||
* Creates OK status; STATUSTYPE_OK, empty message and stackDump.
|
||||
*/
|
||||
Status();
|
||||
Status() :m_statusType(STATUSTYPE_OK) {}
|
||||
|
||||
/**
|
||||
* Create non-OK status.
|
||||
@@ -65,25 +65,25 @@ namespace epics { namespace pvData {
|
||||
*/
|
||||
Status(StatusType type, std::string const & message, std::string const & stackDump);
|
||||
|
||||
~Status();
|
||||
virtual ~Status() {}
|
||||
|
||||
/**
|
||||
* Get status type.
|
||||
* @return status type, non-<code>null</code>.
|
||||
*/
|
||||
StatusType getType() const;
|
||||
inline StatusType getType() const { return m_statusType; }
|
||||
|
||||
/**
|
||||
* Get error message describing an error. Required if error status.
|
||||
* @return error message.
|
||||
*/
|
||||
std::string getMessage() const;
|
||||
inline std::string getMessage() const { return m_message; }
|
||||
|
||||
/**
|
||||
* Get stack dump where error (exception) happened. Optional.
|
||||
* @return stack dump.
|
||||
*/
|
||||
std::string getStackDump() const;
|
||||
inline std::string getStackDump() const { return m_stackDump; }
|
||||
|
||||
/**
|
||||
* Convenient OK test. Same as <code>(getType() == StatusType.OK)</code>.
|
||||
@@ -92,13 +92,47 @@ namespace epics { namespace pvData {
|
||||
* @return OK status.
|
||||
* @see #isSuccess()
|
||||
*/
|
||||
bool isOK() const;
|
||||
inline bool isOK() const {
|
||||
return (m_statusType == STATUSTYPE_OK);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if operation succeeded.
|
||||
* Check if operation succeeded (OK or WARNING).
|
||||
* @return operation success status.
|
||||
*/
|
||||
bool isSuccess() const;
|
||||
inline bool isSuccess() const {
|
||||
return (m_statusType == STATUSTYPE_OK || m_statusType == STATUSTYPE_WARNING);
|
||||
}
|
||||
|
||||
#if __cplusplus>=201103L
|
||||
FORCE_INLINE explicit operator bool() const {
|
||||
return isSuccess();
|
||||
}
|
||||
#else
|
||||
private:
|
||||
typedef bool (Status::*truth_type)() const;
|
||||
public:
|
||||
FORCE_INLINE operator truth_type() const {
|
||||
return isSuccess() ? &Status::isSuccess : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/** override this Status if the other has higher StatusType
|
||||
@code
|
||||
Status ret;
|
||||
ret |= call1();
|
||||
if(ret)
|
||||
ret |= call2();
|
||||
return ret;
|
||||
@endcode
|
||||
*/
|
||||
void maximize(const Status& o);
|
||||
|
||||
//! short hand for "this->maximize(o)"
|
||||
FORCE_INLINE Status& operator|=(const Status& o) {
|
||||
maximize(o);
|
||||
return *this;
|
||||
}
|
||||
|
||||
void serialize(ByteBuffer *buffer, SerializableControl *flusher) const;
|
||||
void deserialize(ByteBuffer *buffer, DeserializableControl *flusher);
|
||||
@@ -113,8 +147,15 @@ namespace epics { namespace pvData {
|
||||
|
||||
};
|
||||
|
||||
epicsShareExtern std::ostream& operator<<(std::ostream& o, const Status& status);
|
||||
epicsShareExtern std::ostream& operator<<(std::ostream& o, const Status::StatusType& statusType);
|
||||
FORCE_INLINE std::ostream& operator<<(std::ostream& o, const Status& status) {
|
||||
status.dump(o);
|
||||
return o;
|
||||
}
|
||||
|
||||
FORCE_INLINE std::ostream& operator<<(std::ostream& o, const Status::StatusType& statusType) {
|
||||
o << Status::StatusTypeName[statusType];
|
||||
return o;
|
||||
}
|
||||
|
||||
}}
|
||||
#endif /* STATUS_H */
|
||||
|
||||
@@ -19,20 +19,11 @@ const char* Status::StatusTypeName[] = { "OK", "WARNING", "ERROR", "FATAL" };
|
||||
|
||||
Status Status::Ok;
|
||||
|
||||
//PVDATA_REFCOUNT_MONITOR_DEFINE(status);
|
||||
|
||||
Status::Status() :
|
||||
m_statusType(STATUSTYPE_OK)
|
||||
{
|
||||
}
|
||||
|
||||
Status::Status(StatusType type, string const & message) :
|
||||
m_statusType(type), m_message(message)
|
||||
{
|
||||
if (type == STATUSTYPE_OK)
|
||||
throw std::invalid_argument("type == STATUSTYPE_OK");
|
||||
|
||||
//PVDATA_REFCOUNT_MONITOR_CONSTRUCT(status);
|
||||
}
|
||||
|
||||
Status::Status(StatusType type, string const & message, string const & stackDump) :
|
||||
@@ -40,38 +31,15 @@ Status::Status(StatusType type, string const & message, string const & stackDump
|
||||
{
|
||||
if (type == STATUSTYPE_OK)
|
||||
throw std::invalid_argument("type == STATUSTYPE_OK");
|
||||
|
||||
//PVDATA_REFCOUNT_MONITOR_CONSTRUCT(status);
|
||||
}
|
||||
|
||||
Status::~Status() {
|
||||
//PVDATA_REFCOUNT_MONITOR_DESTRUCT(status);
|
||||
}
|
||||
|
||||
Status::StatusType Status::getType() const
|
||||
void Status::maximize(const Status& o)
|
||||
{
|
||||
return m_statusType;
|
||||
}
|
||||
|
||||
|
||||
string Status::getMessage() const
|
||||
{
|
||||
return m_message;
|
||||
}
|
||||
|
||||
string Status::getStackDump() const
|
||||
{
|
||||
return m_stackDump;
|
||||
}
|
||||
|
||||
bool Status::isOK() const
|
||||
{
|
||||
return (m_statusType == STATUSTYPE_OK);
|
||||
}
|
||||
|
||||
bool Status::isSuccess() const
|
||||
{
|
||||
return (m_statusType == STATUSTYPE_OK || m_statusType == STATUSTYPE_WARNING);
|
||||
if(m_statusType < o.m_statusType) {
|
||||
m_statusType = o.m_statusType;
|
||||
m_message = o.m_message;
|
||||
m_stackDump = o.m_stackDump;
|
||||
}
|
||||
}
|
||||
|
||||
void Status::serialize(ByteBuffer *buffer, SerializableControl *flusher) const
|
||||
@@ -120,18 +88,6 @@ void Status::dump(std::ostream& o) const
|
||||
if (!m_stackDump.empty())
|
||||
o << ", stackDump=" << std::endl << m_stackDump;
|
||||
o << ']';
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& o, const Status& status)
|
||||
{
|
||||
status.dump(o);
|
||||
return o;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& o, const Status::StatusType& statusType)
|
||||
{
|
||||
o << Status::StatusTypeName[statusType];
|
||||
return o;
|
||||
}
|
||||
|
||||
}}
|
||||
|
||||
Reference in New Issue
Block a user