aboutsummaryrefslogtreecommitdiff
path: root/src/Temperature.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Temperature.cpp')
-rw-r--r--src/Temperature.cpp493
1 files changed, 493 insertions, 0 deletions
diff --git a/src/Temperature.cpp b/src/Temperature.cpp
new file mode 100644
index 0000000000..c5dfa42569
--- /dev/null
+++ b/src/Temperature.cpp
@@ -0,0 +1,493 @@
+/*
+ * Copyright (C) 2005-2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "LangInfo.h"
+#include "guilib/LocalizeStrings.h"
+#include "Temperature.h"
+#include "utils/StringUtils.h"
+#include "utils/Archive.h"
+
+CTemperature::CTemperature()
+{
+ m_value=0.0f;
+ m_state=invalid;
+}
+
+CTemperature::CTemperature(const CTemperature& temperature)
+{
+ m_value=temperature.m_value;
+ m_state=temperature.m_state;
+}
+
+CTemperature::CTemperature(double value)
+{
+ m_value=value;
+ m_state=valid;
+}
+
+bool CTemperature::operator >(const CTemperature& right) const
+{
+ ASSERT(IsValid());
+ ASSERT(right.IsValid());
+
+ if (!IsValid() || !right.IsValid())
+ return false;
+
+ if (this==&right)
+ return false;
+
+ return (m_value>right.m_value);
+}
+
+bool CTemperature::operator >=(const CTemperature& right) const
+{
+ return operator >(right) || operator ==(right);
+}
+
+bool CTemperature::operator <(const CTemperature& right) const
+{
+ ASSERT(IsValid());
+ ASSERT(right.IsValid());
+
+ if (!IsValid() || !right.IsValid())
+ return false;
+
+ if (this==&right)
+ return false;
+
+ return (m_value<right.m_value);
+}
+
+bool CTemperature::operator <=(const CTemperature& right) const
+{
+ return operator <(right) || operator ==(right);
+}
+
+bool CTemperature::operator ==(const CTemperature& right) const
+{
+ ASSERT(IsValid());
+ ASSERT(right.IsValid());
+
+ if (!IsValid() || !right.IsValid())
+ return false;
+
+ if (this==&right)
+ return true;
+
+ return (m_value==right.m_value);
+}
+
+bool CTemperature::operator !=(const CTemperature& right) const
+{
+ return !operator ==(right.m_value);
+}
+
+const CTemperature& CTemperature::operator =(const CTemperature& right)
+{
+ m_state=right.m_state;
+ m_value=right.m_value;
+ return *this;
+}
+
+const CTemperature& CTemperature::operator +=(const CTemperature& right)
+{
+ ASSERT(IsValid());
+ ASSERT(right.IsValid());
+
+ m_value+=right.m_value;
+ return *this;
+}
+
+const CTemperature& CTemperature::operator -=(const CTemperature& right)
+{
+ ASSERT(IsValid());
+ ASSERT(right.IsValid());
+
+ m_value-=right.m_value;
+ return *this;
+}
+
+const CTemperature& CTemperature::operator *=(const CTemperature& right)
+{
+ ASSERT(IsValid());
+ ASSERT(right.IsValid());
+
+ m_value*=right.m_value;
+ return *this;
+}
+
+const CTemperature& CTemperature::operator /=(const CTemperature& right)
+{
+ ASSERT(IsValid());
+ ASSERT(right.IsValid());
+
+ m_value/=right.m_value;
+ return *this;
+}
+
+CTemperature CTemperature::operator +(const CTemperature& right) const
+{
+ ASSERT(IsValid());
+ ASSERT(right.IsValid());
+
+ CTemperature temp(*this);
+
+ if (!IsValid() || !right.IsValid())
+ temp.SetState(invalid);
+ else
+ temp.m_value+=right.m_value;
+
+ return temp;
+}
+
+CTemperature CTemperature::operator -(const CTemperature& right) const
+{
+ ASSERT(IsValid());
+ ASSERT(right.IsValid());
+
+ CTemperature temp(*this);
+ if (!IsValid() || !right.IsValid())
+ temp.SetState(invalid);
+ else
+ temp.m_value-=right.m_value;
+
+ return temp;
+}
+
+CTemperature CTemperature::operator *(const CTemperature& right) const
+{
+ ASSERT(IsValid());
+ ASSERT(right.IsValid());
+
+ CTemperature temp(*this);
+ if (!IsValid() || !right.IsValid())
+ temp.SetState(invalid);
+ else
+ temp.m_value*=right.m_value;
+ return temp;
+}
+
+CTemperature CTemperature::operator /(const CTemperature& right) const
+{
+ ASSERT(IsValid());
+ ASSERT(right.IsValid());
+
+ CTemperature temp(*this);
+ if (!IsValid() || !right.IsValid())
+ temp.SetState(invalid);
+ else
+ temp.m_value/=right.m_value;
+ return temp;
+}
+
+CTemperature& CTemperature::operator ++()
+{
+ ASSERT(IsValid());
+
+ m_value++;
+ return *this;
+}
+
+CTemperature& CTemperature::operator --()
+{
+ ASSERT(IsValid());
+
+ m_value--;
+ return *this;
+}
+
+CTemperature CTemperature::operator ++(int)
+{
+ ASSERT(IsValid());
+
+ CTemperature temp(*this);
+ m_value++;
+ return temp;
+}
+
+CTemperature CTemperature::operator --(int)
+{
+ ASSERT(IsValid());
+
+ CTemperature temp(*this);
+ m_value--;
+ return temp;
+}
+
+bool CTemperature::operator >(double right) const
+{
+ ASSERT(IsValid());
+
+ if (!IsValid())
+ return false;
+
+ return (m_value>right);
+}
+
+bool CTemperature::operator >=(double right) const
+{
+ return operator >(right) || operator ==(right);
+}
+
+bool CTemperature::operator <(double right) const
+{
+ ASSERT(IsValid());
+
+ if (!IsValid())
+ return false;
+
+ return (m_value<right);
+}
+
+bool CTemperature::operator <=(double right) const
+{
+ return operator <(right) || operator ==(right);
+}
+
+bool CTemperature::operator ==(double right) const
+{
+ if (!IsValid())
+ return false;
+
+ return (m_value==right);
+}
+
+bool CTemperature::operator !=(double right) const
+{
+ return !operator ==(right);
+}
+
+const CTemperature& CTemperature::operator +=(double right)
+{
+ ASSERT(IsValid());
+
+ m_value+=right;
+ return *this;
+}
+
+const CTemperature& CTemperature::operator -=(double right)
+{
+ ASSERT(IsValid());
+
+ m_value-=right;
+ return *this;
+}
+
+const CTemperature& CTemperature::operator *=(double right)
+{
+ ASSERT(IsValid());
+
+ m_value*=right;
+ return *this;
+}
+
+const CTemperature& CTemperature::operator /=(double right)
+{
+ ASSERT(IsValid());
+
+ m_value/=right;
+ return *this;
+}
+
+CTemperature CTemperature::operator +(double right) const
+{
+ ASSERT(IsValid());
+
+ CTemperature temp(*this);
+ temp.m_value+=right;
+ return temp;
+}
+
+CTemperature CTemperature::operator -(double right) const
+{
+ ASSERT(IsValid());
+
+ CTemperature temp(*this);
+ temp.m_value-=right;
+ return temp;
+}
+
+CTemperature CTemperature::operator *(double right) const
+{
+ ASSERT(IsValid());
+
+ CTemperature temp(*this);
+ temp.m_value*=right;
+ return temp;
+}
+
+CTemperature CTemperature::operator /(double right) const
+{
+ ASSERT(IsValid());
+
+ CTemperature temp(*this);
+ temp.m_value/=right;
+ return temp;
+}
+
+CTemperature CTemperature::CreateFromFahrenheit(double value)
+{
+ return CTemperature(value);
+}
+
+CTemperature CTemperature::CreateFromReaumur(double value)
+{
+ return CTemperature(value*2.25f+32.0f);
+}
+
+CTemperature CTemperature::CreateFromRankine(double value)
+{
+ return CTemperature(value-459.67f);
+}
+
+CTemperature CTemperature::CreateFromRomer(double value)
+{
+ return CTemperature((value-7.5f)*24.0f/7.0f+32.0f);
+}
+
+CTemperature CTemperature::CreateFromDelisle(double value)
+{
+ CTemperature temp(212.0f - value * 1.2f);
+ return temp;
+}
+
+CTemperature CTemperature::CreateFromNewton(double value)
+{
+ return CTemperature(value*60.0f/11.0f+32.0f);
+}
+
+CTemperature CTemperature::CreateFromCelsius(double value)
+{
+ return CTemperature(value*1.8f+32.0f);
+}
+
+void CTemperature::Archive(CArchive& ar)
+{
+ if (ar.IsStoring())
+ {
+ ar<<m_value;
+ ar<<(int)m_state;
+ }
+ else
+ {
+ ar>>m_value;
+ int state;
+ ar>>(int&)state;
+ m_state = CTemperature::STATE(state);
+ }
+}
+
+void CTemperature::SetState(CTemperature::STATE state)
+{
+ m_state=state;
+}
+
+bool CTemperature::IsValid() const
+{
+ return (m_state==valid);
+}
+
+double CTemperature::ToFahrenheit() const
+{
+ return m_value;
+}
+
+double CTemperature::ToKelvin() const
+{
+ return (m_value+459.67F)/1.8f;
+}
+
+double CTemperature::ToCelsius() const
+{
+ return (m_value-32.0f)/1.8f;
+}
+
+double CTemperature::ToReaumur() const
+{
+ return (m_value-32.0f)/2.25f;
+}
+
+double CTemperature::ToRankine() const
+{
+ return m_value+459.67f;
+}
+
+double CTemperature::ToRomer() const
+{
+ return (m_value-32.0f)*7.0f/24.0f+7.5f;
+}
+
+double CTemperature::ToDelisle() const
+{
+ return (212.f-m_value)*5.0f/6.0f;
+}
+
+double CTemperature::ToNewton() const
+{
+ return (m_value-32.0f)*11.0f/60.0f;
+}
+
+double CTemperature::ToLocale() const
+{
+ if (!IsValid())
+ return 0;
+ double value = 0.0;
+
+ switch(g_langInfo.GetTempUnit())
+ {
+ case CLangInfo::TEMP_UNIT_FAHRENHEIT:
+ value=ToFahrenheit();
+ break;
+ case CLangInfo::TEMP_UNIT_KELVIN:
+ value=ToKelvin();
+ break;
+ case CLangInfo::TEMP_UNIT_CELSIUS:
+ value=ToCelsius();
+ break;
+ case CLangInfo::TEMP_UNIT_REAUMUR:
+ value=ToReaumur();
+ break;
+ case CLangInfo::TEMP_UNIT_RANKINE:
+ value=ToRankine();
+ break;
+ case CLangInfo::TEMP_UNIT_ROMER:
+ value=ToRomer();
+ break;
+ case CLangInfo::TEMP_UNIT_DELISLE:
+ value=ToDelisle();
+ break;
+ case CLangInfo::TEMP_UNIT_NEWTON:
+ value=ToNewton();
+ break;
+ default:
+ ASSERT(false);
+ break;
+ }
+ return value;
+}
+
+// Returns temperature as localized string
+std::string CTemperature::ToString() const
+{
+ if (!IsValid())
+ return g_localizeStrings.Get(13205); // "Unknown"
+
+ return StringUtils::Format("%2.0f%s", ToLocale(), g_langInfo.GetTempUnitString().c_str());
+}