From f8f2e7fee1140f0de363a1ee77169c86d0f75cc4 Mon Sep 17 00:00:00 2001 From: weidai Date: Fri, 13 Mar 2009 11:16:28 +0000 Subject: [PATCH] fix compile on gcc 4.1.2, armv5tel --- algparam.cpp | 45 ++++++--------------------------------------- algparam.h | 27 +++++---------------------- 2 files changed, 11 insertions(+), 61 deletions(-) diff --git a/algparam.cpp b/algparam.cpp index 89eacfe8..a70d5dd9 100644 --- a/algparam.cpp +++ b/algparam.cpp @@ -46,63 +46,30 @@ bool AlgorithmParametersBase::GetVoidValue(const char *name, const std::type_inf } AlgorithmParameters::AlgorithmParameters() - : m_constructed(false), m_defaultThrowIfNotUsed(true) + : m_defaultThrowIfNotUsed(true) { - new(m_first) member_ptr; } AlgorithmParameters::AlgorithmParameters(const AlgorithmParameters &x) - : m_constructed(false), m_defaultThrowIfNotUsed(x.m_defaultThrowIfNotUsed) + : m_defaultThrowIfNotUsed(x.m_defaultThrowIfNotUsed) { - if (x.m_constructed) - { - x.First().MoveInto(m_first); - m_constructed = true; - } - else - new(m_first) member_ptr(x.Next().release()); -} - -AlgorithmParameters::~AlgorithmParameters() -{ - if (m_constructed) - First().~AlgorithmParametersBase(); - else - Next().~member_ptr(); + m_next.reset(const_cast(x).m_next.release()); } AlgorithmParameters & AlgorithmParameters::operator=(const AlgorithmParameters &x) { - if (this == &x) - return *this; - this->~AlgorithmParameters(); - new (this) AlgorithmParameters(x); + m_next.reset(const_cast(x).m_next.release()); return *this; } bool AlgorithmParameters::GetVoidValue(const char *name, const std::type_info &valueType, void *pValue) const { - if (m_constructed) - return First().GetVoidValue(name, valueType, pValue); - else if (Next().get()) - return Next()->GetVoidValue(name, valueType, pValue); + if (m_next.get()) + return m_next->GetVoidValue(name, valueType, pValue); else return false; } -AlgorithmParametersBase & AlgorithmParameters::First() -{ - return *reinterpret_cast(m_first); -} - -member_ptr & AlgorithmParameters::Next() -{ - if (m_constructed) - return First().m_next; - else - return *reinterpret_cast *>(m_first); -} - NAMESPACE_END #endif diff --git a/algparam.h b/algparam.h index f87c93d4..140f5797 100644 --- a/algparam.h +++ b/algparam.h @@ -337,26 +337,14 @@ public: AlgorithmParameters(const AlgorithmParameters &x); - ~AlgorithmParameters(); - AlgorithmParameters & operator=(const AlgorithmParameters &x); template AlgorithmParameters & operator()(const char *name, const T &value, bool throwIfNotUsed) { - if (m_constructed || sizeof(m_first) < sizeof(AlgorithmParametersTemplate)) - { - member_ptr p(new AlgorithmParametersTemplate(name, value, throwIfNotUsed)); - p->m_next.reset(Next().release()); - Next().reset(p.release()); - } - else - { - member_ptr temp(Next().release()); - AlgorithmParametersTemplate* p = new(m_first) AlgorithmParametersTemplate(name, value, throwIfNotUsed); - p->m_next.reset(temp.release()); - m_constructed = true; - } + member_ptr p(new AlgorithmParametersTemplate(name, value, throwIfNotUsed)); + p->m_next.reset(m_next.release()); + m_next.reset(p.release()); m_defaultThrowIfNotUsed = throwIfNotUsed; return *this; } @@ -370,13 +358,8 @@ public: bool GetVoidValue(const char *name, const std::type_info &valueType, void *pValue) const; protected: - AlgorithmParametersBase & First(); - member_ptr & Next(); - const AlgorithmParametersBase & First() const {return const_cast(this)->First();} - member_ptr & Next() const {return const_cast(this)->Next();} - - bool m_constructed, m_defaultThrowIfNotUsed; - size_t m_first[(sizeof(AlgorithmParametersBase) + 19)/sizeof(size_t)]; + member_ptr m_next; + bool m_defaultThrowIfNotUsed; }; //! Create an object that implements NameValuePairs for passing parameters