Status: inline trival and add maximize() w/ shorthand operator |=

This commit is contained in:
Michael Davidsaver
2017-09-29 13:37:20 -05:00
parent f3e7f9bb8f
commit 635eb9d36d
2 changed files with 57 additions and 60 deletions

View File

@@ -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 */

View File

@@ -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;
}
}}