committed by
dsa-t
1 changed files with 115 additions and 0 deletions
@ -0,0 +1,115 @@ |
|||||
|
/* |
||||
|
* This program source code file is part of KiCad, a free EDA CAD application. |
||||
|
* |
||||
|
* Copyright (C) 2023 Alex Shvartzkop <dudesuchamazing@gmail.com> |
||||
|
* Copyright (C) 2023 KiCad Developers, see AUTHORS.txt for contributors. |
||||
|
* |
||||
|
* 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 |
||||
|
* of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. |
||||
|
*/ |
||||
|
|
||||
|
#ifndef STRING_ANY_MAP_H_ |
||||
|
#define STRING_ANY_MAP_H_ |
||||
|
|
||||
|
#include <string> |
||||
|
#include <map> |
||||
|
#include <optional> |
||||
|
|
||||
|
#include <wx/any.h> |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* A name/value tuple with unique names and wxAny values. The names |
||||
|
* may be iterated alphabetically. |
||||
|
*/ |
||||
|
class STRING_ANY_MAP : public std::map<std::string, wxAny> |
||||
|
{ |
||||
|
double m_iuScale; |
||||
|
|
||||
|
public: |
||||
|
|
||||
|
STRING_ANY_MAP( double aIUScale = 1.0 ) : m_iuScale( aIUScale ) {} |
||||
|
|
||||
|
template <typename T> |
||||
|
bool get_to( const std::string& aKey, T& aVar ) const |
||||
|
{ |
||||
|
if( !contains( aKey ) ) |
||||
|
return false; |
||||
|
|
||||
|
return at( aKey ).GetAs( &aVar ); |
||||
|
} |
||||
|
|
||||
|
template <typename T> |
||||
|
bool get_to_iu( const std::string& aKey, T& aVar ) const |
||||
|
{ |
||||
|
if( !contains( aKey ) ) |
||||
|
return false; |
||||
|
|
||||
|
const wxAny& value = at( aKey ); |
||||
|
|
||||
|
if( value.CheckType<double>() || value.CheckType<int>() || value.CheckType<long>() |
||||
|
|| value.CheckType<long long>() ) |
||||
|
{ |
||||
|
double number; |
||||
|
|
||||
|
if( !value.GetAs( &number ) ) |
||||
|
return false; |
||||
|
|
||||
|
number *= m_iuScale; |
||||
|
aVar = number; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
if( !value.GetAs( &aVar ) ) |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
template <typename T> |
||||
|
void set( const std::string& aKey, const T& aVar ) |
||||
|
{ |
||||
|
emplace( aKey, aVar ); |
||||
|
} |
||||
|
|
||||
|
template <typename T> |
||||
|
void set_iu( const std::string& aKey, const T& aVar) |
||||
|
{ |
||||
|
emplace( aKey, aVar / m_iuScale ); |
||||
|
} |
||||
|
|
||||
|
bool contains( const std::string& aKey ) const |
||||
|
{ // |
||||
|
return find( aKey ) != end(); |
||||
|
} |
||||
|
|
||||
|
template <typename T> |
||||
|
std::optional<T> get_opt( const std::string& aKey ) const |
||||
|
{ |
||||
|
if( contains( aKey ) ) |
||||
|
{ |
||||
|
T val; |
||||
|
|
||||
|
if( !at( aKey ).GetAs( &val ) ) |
||||
|
return std::nullopt; |
||||
|
|
||||
|
return val; |
||||
|
} |
||||
|
|
||||
|
return std::nullopt; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
#endif // STRING_ANY_MAP_H_ |
Write
Preview
Loading…
Cancel
Save
Reference in new issue