variable.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*-----------------------------------------------------------------------------
  2. | Copyright (c) 2013-2017, Nucleic Development Team.
  3. |
  4. | Distributed under the terms of the Modified BSD License.
  5. |
  6. | The full license is in the file COPYING.txt, distributed with this software.
  7. |----------------------------------------------------------------------------*/
  8. #pragma once
  9. #include <memory>
  10. #include <string>
  11. #include "shareddata.h"
  12. namespace kiwi
  13. {
  14. class Variable
  15. {
  16. public:
  17. class Context
  18. {
  19. public:
  20. Context() {}
  21. virtual ~Context() {} // LCOV_EXCL_LINE
  22. };
  23. Variable( Context* context = 0 ) :
  24. m_data( new VariableData( "", context ) ) {}
  25. Variable( const std::string& name, Context* context = 0 ) :
  26. m_data( new VariableData( name, context ) ) {}
  27. Variable( const char* name, Context* context = 0 ) :
  28. m_data( new VariableData( name, context ) ) {}
  29. ~Variable() {}
  30. const std::string& name() const
  31. {
  32. return m_data->m_name;
  33. }
  34. void setName( const char* name )
  35. {
  36. m_data->m_name = name;
  37. }
  38. void setName( const std::string& name )
  39. {
  40. m_data->m_name = name;
  41. }
  42. Context* context() const
  43. {
  44. return m_data->m_context.get();
  45. }
  46. void setContext( Context* context )
  47. {
  48. m_data->m_context.reset( context );
  49. }
  50. double value() const
  51. {
  52. return m_data->m_value;
  53. }
  54. void setValue( double value )
  55. {
  56. m_data->m_value = value;
  57. }
  58. // operator== is used for symbolics
  59. bool equals( const Variable& other )
  60. {
  61. return m_data == other.m_data;
  62. }
  63. private:
  64. class VariableData : public SharedData
  65. {
  66. public:
  67. VariableData( const std::string& name, Context* context ) :
  68. SharedData(),
  69. m_name( name ),
  70. m_context( context ),
  71. m_value( 0.0 ) {}
  72. VariableData( const char* name, Context* context ) :
  73. SharedData(),
  74. m_name( name ),
  75. m_context( context ),
  76. m_value( 0.0 ) {}
  77. ~VariableData() {}
  78. std::string m_name;
  79. std::auto_ptr<Context> m_context;
  80. double m_value;
  81. private:
  82. VariableData( const VariableData& other );
  83. VariableData& operator=( const VariableData& other );
  84. };
  85. SharedDataPtr<VariableData> m_data;
  86. friend bool operator<( const Variable& lhs, const Variable& rhs )
  87. {
  88. return lhs.m_data < rhs.m_data;
  89. }
  90. };
  91. } // namespace kiwi