]> Creatis software - cpPlugins.git/blobdiff - lib/cpPlugins/Pipeline/Parameters.h
yet another refactoring
[cpPlugins.git] / lib / cpPlugins / Pipeline / Parameters.h
diff --git a/lib/cpPlugins/Pipeline/Parameters.h b/lib/cpPlugins/Pipeline/Parameters.h
new file mode 100644 (file)
index 0000000..4dbd871
--- /dev/null
@@ -0,0 +1,223 @@
+#ifndef __cpPlugins__Pipeline__Parameters__h__
+#define __cpPlugins__Pipeline__Parameters__h__
+
+#include <cpPlugins/Config.h>
+
+#include <map>
+#include <ostream>
+#include <sstream>
+#include <typeinfo>
+#include <vector>
+#include <itkTimeStamp.h>
+
+// Some forward declarations
+namespace tinyxml2
+{
+  class XMLElement;
+  class XMLDocument;
+}
+
+// -------------------------------------------------------------------------
+#define cpPlugins_Pipeline_Parameters_Configure( Y )                 \
+  void ConfigureAs##Y( const std::string& name, const T##Y& init );     \
+  bool Has##Y( const std::string& name ) const
+
+// -------------------------------------------------------------------------
+#define cpPlugins_Pipeline_Parameters_ConfigureList( Y )             \
+  void ConfigureAs##Y##List( const std::string& name );                 \
+  bool Has##Y##List( const std::string& name ) const
+
+// -------------------------------------------------------------------------
+#define cpPlugins_Pipeline_Parameters_GetSet( Y )    \
+  T##Y Get##Y( const std::string& name ) const;         \
+  void Set##Y( const std::string& name, const T##Y& v )
+
+// -------------------------------------------------------------------------
+#define cpPlugins_Pipeline_Parameters_GetSetList( Y )                \
+  std::vector< T##Y > Get##Y##List( const std::string& name ) const;    \
+  void AddTo##Y##List( const std::string& name, const T##Y& v );        \
+  void Clear##Y##List( const std::string& name )
+
+// -------------------------------------------------------------------------
+namespace cpPlugins
+{
+  namespace QT { class ParametersDialog; }
+
+  namespace Pipeline
+  {
+    class ProcessObject;
+
+    /**
+     */
+    class cpPlugins_EXPORT Parameters
+    {
+      // Frienship with forward declaration to improve Qt dialog execution
+      friend class cpPlugins::QT::ParametersDialog;
+      friend std::ostream& operator<<( std::ostream& o, const Parameters& p )
+        {
+          for(
+            auto i = p.m_Parameters.begin( );
+            i != p.m_Parameters.end( );
+            ++i
+            )
+            o << i->first << ": ("
+              << i->second.first << " | "
+              << i->second.second << ")"
+              << std::endl;
+          return( o );
+        }
+
+    public:
+      typedef Parameters Self;
+
+      enum Type
+      {
+        String       , Bool             , Int              ,
+        Uint         , Real             , OpenFileName     ,
+        SaveFileName , PathName         , StringList       ,
+        BoolList     , IntList          , UintList         ,
+        RealList     , OpenFileNameList , SaveFileNameList ,
+        PathNameList , Choices          , NoType
+      };
+
+      typedef bool          TBool;
+      typedef long          TInt;
+      typedef unsigned long TUint;
+      typedef double        TReal;
+      typedef std::string   TString;
+      typedef std::string   TOpenFileName;
+      typedef std::string   TSaveFileName;
+      typedef std::string   TPathName;
+
+      typedef std::pair< Self::Type, std::string > TParameter;
+      typedef std::map< std::string, TParameter >  TParameters;
+
+    public:
+      cpPlugins_Pipeline_Parameters_Configure( String );
+      cpPlugins_Pipeline_Parameters_Configure( Bool );
+      cpPlugins_Pipeline_Parameters_Configure( Int );
+      cpPlugins_Pipeline_Parameters_Configure( Uint );
+      cpPlugins_Pipeline_Parameters_Configure( Real );
+      cpPlugins_Pipeline_Parameters_Configure( OpenFileName );
+      cpPlugins_Pipeline_Parameters_Configure( SaveFileName );
+      cpPlugins_Pipeline_Parameters_Configure( PathName );
+
+      cpPlugins_Pipeline_Parameters_ConfigureList( String );
+      cpPlugins_Pipeline_Parameters_ConfigureList( Bool );
+      cpPlugins_Pipeline_Parameters_ConfigureList( Int );
+      cpPlugins_Pipeline_Parameters_ConfigureList( Uint );
+      cpPlugins_Pipeline_Parameters_ConfigureList( Real );
+      cpPlugins_Pipeline_Parameters_ConfigureList( OpenFileName );
+      cpPlugins_Pipeline_Parameters_ConfigureList( SaveFileName );
+      cpPlugins_Pipeline_Parameters_ConfigureList( PathName );
+
+      cpPlugins_Pipeline_Parameters_GetSet( Bool );
+      cpPlugins_Pipeline_Parameters_GetSet( Int );
+      cpPlugins_Pipeline_Parameters_GetSet( Uint );
+      cpPlugins_Pipeline_Parameters_GetSet( Real );
+      cpPlugins_Pipeline_Parameters_GetSet( OpenFileName );
+      cpPlugins_Pipeline_Parameters_GetSet( SaveFileName );
+      cpPlugins_Pipeline_Parameters_GetSet( PathName );
+
+      cpPlugins_Pipeline_Parameters_GetSetList( String );
+      cpPlugins_Pipeline_Parameters_GetSetList( Bool );
+      cpPlugins_Pipeline_Parameters_GetSetList( Int );
+      cpPlugins_Pipeline_Parameters_GetSetList( Uint );
+      cpPlugins_Pipeline_Parameters_GetSetList( Real );
+      cpPlugins_Pipeline_Parameters_GetSetList( OpenFileName );
+      cpPlugins_Pipeline_Parameters_GetSetList( SaveFileName );
+      cpPlugins_Pipeline_Parameters_GetSetList( PathName );
+
+    public:
+      Parameters( );
+      virtual ~Parameters( );
+
+      ProcessObject* GetProcessObject( );
+      const ProcessObject* GetProcessObject( ) const;
+      void SetProcessObject( ProcessObject* po );
+      virtual void Modified( ) const;
+
+      // Parameters container configuration
+      void Clear( );
+
+      // Get methods
+      void GetNames( std::vector< std::string >& container ) const;
+      Type GetType( const std::string& name ) const;
+      std::string GetTypeAsString( const std::string& name ) const;
+      static Type GetTypeFromString( const std::string& t );
+
+      // Base string methods
+      std::string GetString(
+        const std::string& name, bool force = true
+        ) const;
+      void SetString(
+        const std::string& name, const std::string& v, bool force = true
+        );
+
+      void ConfigureAsChoices(
+        const std::string& name, const std::vector< std::string >& choices
+        );
+      void ConfigureAsRealTypesChoices( const std::string& name );
+      void ConfigureAsIntTypesChoices( const std::string& name );
+      void ConfigureAsScalarTypesChoices( const std::string& name );
+      std::vector< std::string > GetChoices( const std::string& name ) const;
+      std::string GetSelectedChoice( const std::string& name ) const;
+      bool SetSelectedChoice(
+        const std::string& name, const std::string& choice
+        );
+
+      std::string GetAcceptedFileExtensions( const std::string& name ) const;
+      void SetAcceptedFileExtensions(
+        const std::string& name, const std::string& extensions
+        );
+
+      // XML "streaming"
+      bool ToXML(
+        tinyxml2::XMLDocument* doc,
+        tinyxml2::XMLElement* parent_elem
+        ) const;
+      bool FromXML( const tinyxml2::XMLElement* filter_elem );
+
+    protected:
+      TParameters& GetRawParameters( );
+      const TParameters& GetRawParameters( ) const;
+
+      template< unsigned int _Enum >
+      inline void _Configure( const std::string& name );
+
+      template< unsigned int _Enum >
+      inline bool _Has( const std::string& name ) const;
+
+      template< class _Type, unsigned int _Enum >
+      inline _Type _Get( const std::string& name ) const;
+
+      template< class _Type, unsigned int _Enum >
+      inline void _Set( const std::string& name, const _Type& v );
+
+      template< class _Type, unsigned int _Enum >
+      inline std::vector< _Type > _GetList( const std::string& name ) const;
+
+      template< class _Type, unsigned int _Enum >
+      inline void _AddToList( const std::string& name, const _Type& v );
+
+      template< unsigned int _Enum >
+      inline void _ClearList( const std::string& name );
+
+    private:
+      // Purposely not implemented
+      Parameters( const Self& other );
+      Self& operator=( const Self& other );
+
+    protected:
+      ProcessObject*                       m_ProcessObject;
+      TParameters                          m_Parameters;
+      std::map< std::string, std::string > m_AcceptedFileExtensions;
+    };
+
+  } // ecapseman
+
+} // ecapseman
+
+#endif // __cpPlugins__Pipeline__Parameters__h__
+
+// eof - $RCSfile$