00001 /*========================================================================= 00002 00003 Program: Medical Imaging & Interaction Toolkit 00004 Language: C++ 00005 Date: $Date$ 00006 Version: $Revision$ 00007 00008 Copyright (c) German Cancer Research Center, Division of Medical and 00009 Biological Informatics. All rights reserved. 00010 See MITKCopyright.txt or https://www.mitk.org/copyright.html for details. 00011 00012 This software is distributed WITHOUT ANY WARRANTY; without even 00013 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00014 PURPOSE. See the above copyright notices for more information. 00015 00016 =========================================================================*/ 00017 00018 #include "mitkEnumerationProperty.h" 00019 #include <algorithm> 00020 00021 // static map members of EnumerationProperty. These Maps point to per-classname-maps of ID <-> String. Accessed by GetEnumIds() and GetEnumString(). 00022 mitk::EnumerationProperty::IdMapForClassNameContainerType mitk::EnumerationProperty::s_IdMapForClassName; 00023 mitk::EnumerationProperty::StringMapForClassNameContainerType mitk::EnumerationProperty::s_StringMapForClassName; 00024 00025 00026 mitk::EnumerationProperty::EnumerationProperty() 00027 { 00028 m_CurrentValue = 0; 00029 } 00030 00031 00032 bool mitk::EnumerationProperty::AddEnum( const std::string& name, const IdType& id ) 00033 { 00034 if ( ( ! IsValidEnumerationValue( name ) ) && ( ! IsValidEnumerationValue( id ) ) ) 00035 { 00036 GetEnumIds().insert( std::make_pair( id, name ) ); 00037 GetEnumStrings().insert( std::make_pair( name, id ) ); 00038 return true; 00039 } 00040 else 00041 { 00042 return false; 00043 } 00044 } 00045 00046 00047 bool mitk::EnumerationProperty::SetValue( const std::string& name ) 00048 { 00049 if ( IsValidEnumerationValue( name ) ) 00050 { 00051 m_CurrentValue = GetEnumId( name ); 00052 Modified(); 00053 return true; 00054 } 00055 else 00056 { 00057 return false; 00058 } 00059 } 00060 00061 bool mitk::EnumerationProperty::SetValue( const IdType& id ) 00062 { 00063 if ( IsValidEnumerationValue( id ) ) 00064 { 00065 m_CurrentValue = id; 00066 Modified(); 00067 return true; 00068 } 00069 else 00070 { 00071 return false; 00072 } 00073 } 00074 00075 mitk::EnumerationProperty::IdType mitk::EnumerationProperty::GetValueAsId() const 00076 { 00077 return m_CurrentValue; 00078 } 00079 00080 std::string mitk::EnumerationProperty::GetValueAsString() const 00081 { 00082 return GetEnumString( m_CurrentValue ); 00083 } 00084 00085 00086 void mitk::EnumerationProperty::Clear() 00087 { 00088 GetEnumIds().clear(); 00089 GetEnumStrings().clear(); 00090 m_CurrentValue = 0; 00091 } 00092 00093 00094 mitk::EnumerationProperty::EnumIdsContainerType::size_type mitk::EnumerationProperty::Size() const 00095 { 00096 return GetEnumIds().size(); 00097 } 00098 00099 00100 00101 mitk::EnumerationProperty::EnumConstIterator mitk::EnumerationProperty::Begin() const 00102 { 00103 return GetEnumIds().begin(); 00104 } 00105 00106 00107 mitk::EnumerationProperty::EnumConstIterator mitk::EnumerationProperty::End() const 00108 { 00109 return GetEnumIds().end(); 00110 } 00111 00112 00113 std::string mitk::EnumerationProperty::GetEnumString( const IdType& id ) const 00114 { 00115 if ( IsValidEnumerationValue( id ) ) 00116 { 00117 return GetEnumIds().find( id )->second; 00118 } 00119 else 00120 { 00121 return "invalid enum id or enums empty"; 00122 } 00123 } 00124 00125 00126 mitk::EnumerationProperty::IdType mitk::EnumerationProperty::GetEnumId( const std::string& name ) const 00127 { 00128 if ( IsValidEnumerationValue( name ) ) 00129 { 00130 return GetEnumStrings().find( name )->second; 00131 } 00132 else 00133 { 00134 return 0; 00135 } 00136 } 00137 00138 00139 bool mitk::EnumerationProperty::operator==( const BaseProperty& property ) const 00140 { 00141 const Self * other = dynamic_cast<const Self*>( &property ); 00142 00143 if ( other == NULL ) 00144 return false; 00145 00146 if ( this->Size() != other->Size() ) 00147 return false; 00148 00149 if ( this->GetValueAsId() != other->GetValueAsId() ) 00150 return false; 00151 00152 return std::equal( this->Begin(), this->End(), other->Begin() ); 00153 } 00154 00155 00156 bool mitk::EnumerationProperty::IsValidEnumerationValue( const IdType& val ) const 00157 { 00158 return ( GetEnumIds().find( val ) != GetEnumIds().end() ); 00159 } 00160 00161 00162 bool mitk::EnumerationProperty::IsValidEnumerationValue( const std::string& val ) const 00163 { 00164 return ( GetEnumStrings().find( val ) != GetEnumStrings().end() ); 00165 } 00166 00167 00168 mitk::EnumerationProperty::EnumIdsContainerType& mitk::EnumerationProperty::GetEnumIds() 00169 { 00170 std::string className = this->GetNameOfClass(); // virtual! 00171 return s_IdMapForClassName[ className ]; 00172 } 00173 00174 00175 const mitk::EnumerationProperty::EnumIdsContainerType& mitk::EnumerationProperty::GetEnumIds() const 00176 { 00177 std::string className = this->GetNameOfClass(); // virtual! 00178 return s_IdMapForClassName[ className ]; 00179 } 00180 00181 00182 mitk::EnumerationProperty::EnumStringsContainerType& mitk::EnumerationProperty::GetEnumStrings() 00183 { 00184 std::string className = this->GetNameOfClass(); // virtual! 00185 return s_StringMapForClassName[ className ]; 00186 } 00187 00188 00189 const mitk::EnumerationProperty::EnumStringsContainerType& mitk::EnumerationProperty::GetEnumStrings() const 00190 { 00191 std::string className = this->GetNameOfClass(); // virtual! 00192 return s_StringMapForClassName[ className ]; 00193 } 00194