//-------------------------------------------------------------------
// ObjectWindows
// Copyright(c) 1996 by Manic Software. All rights reserved.
// Copyright (c) 1998 by Yura Bidus, All Rights Reserved
/// \file
/// Credits:
///      The Property pattern is taken from "Patterns in Practice: A Property
/// Template for C++", from "C++ Report", Nov/Dec 1995, p. 28-33, by Colin
/// Hastie. I've in turn extended it to allow for "true" Delphi-like property
/// syntax by allowing you to assign normal T objects to the TProperty<T>, as well
/// as provide an implict conversion-to-T operator. Note that this implicit
/// conversion is NOT highly held in regard by many C++-ers, and therefore can
/// be \#defined out of existence by \#define-ing STRICT_PROPERTY_SYNTAX before
/// \#include-ing this file.
///      Delphi (and C++Builder) also allow for methods to be used instead of
/// direct access to data members; this, too, is allowed, by making use of the
/// callback mechanism within VDBT/BDTF.H. TProperty<T> can be constructed to
/// take two callbacks, one returning T taking void (get), and the other returning
/// void and taking a const T& (set). These methods will be called in place of
/// accessing the m_content method of Property<>, below. Note that I'm assuming
/// that if you write the 'get', you'll also write the 'set', and that both methods
/// provide their own storage for T (instead of relying on m_content within the
/// TProperty<T>).
///
/// Requirements; TProperty assumes that the type T has meaningful orthodox
/// canonical form semantics (default ctor, copy ctor, assignment op, dtor)
//
//
// Additions:
//          TRefProperty<>
//          TConstRefProperty<>
//          TObjProperty<>
//          TConstObjProperty<>
//          TFuncProperty<>
//          TFuncPropertyGet<>
//          TFuncPropertyPut<>
//          TFuncPropertyVarPut<>
//          TFuncPropertyIdxGet<>
//          TFuncPropertyIdxPut<>
//          TFuncPropertyIdx<>
//
//-------------------------------------------------------------------
 
#if !defined(OWL_PROPERTY_H)
#define OWL_PROPERTY_H
 
#include <owl/private/defs.h>
#if defined(BI_HAS_PRAGMA_ONCE)
# pragma once
#endif
 
#include <owl/functor.h>
 
namespace owl {
 
/// \cond NoSuppressDoxygenWarning
#include <owl/preclass.h>
/// \endcond
 
/// \addtogroup utility_group
/// @{
 
//------------------------------------------------------------------------------
/// simple type/pointer
template <class T>
class TProperty{
  // Object lifetime methods
  //
  public:
    TProperty(){}
    explicit TProperty(const T& t) : Content(t) {}
    ~TProperty() {}
 
  // Accessors
  //
  public:
    T operator()() const   { return Content; }
#ifndef STRICT_PROPERTY_SYNTAX
    operator T()           { return Content; }
#endif
 
  // Mutators
  //
  public:
    void operator()(const T& t)           { Content = t; }
#ifndef STRICT_PROPERTY_SYNTAX
    TProperty<T>& operator=(const T& t)   { Content = t; return *this; }
#endif
 
  // Disallowed methods
  //
  private:
    void operator=(const TProperty<T>&);
 
  // Internal Data
  //
  private:
    T Content;
};
 
// simple type/pointer
template <class T>
class TConstProperty{
  // Ctors & Dtors
  //
  public:
    TConstProperty(const T& t) : Content(t) {}
    ~TConstProperty() {}
 
   // Accessor & Mutator
  //
  public:
    T operator()()              { return Content; }
    const T operator()() const   { return Content; }
#ifndef STRICT_PROPERTY_SYNTAX
    operator T()                 { return Content; }
#endif
 
  // Disallowed methods
  //
  private:
    void operator=(const TConstProperty<T>&);
    TConstProperty();
 
  // Data members
  //
  private:
    T Content;
};
 
//------------------------------------------------------------------------------
// Additions made by Yura Bidus 1998
//------------------------------------------------------------------------------
/// Property container for object
template <class T>
class TObjProperty{
  public:
    explicit TObjProperty(const T& t);
    TObjProperty(T* t);
    TObjProperty();
    ~TObjProperty();
 
  public:
    operator T*();
    operator const T&() const;
    T* operator->();
    const T& operator*();
 
    T* operator=( T* t);
    T& operator=( T& t);
    TObjProperty<T>& operator=(const T& t);
 
    const T& operator()() const;
    void operator()(const T& t);
 
  private:
    void operator=(const TObjProperty<T>&);
 
  private:
    T* Content;
};
//------------------------------------------------------------------------------
/// Read only Property container for object
template <class T>
class TConstObjProperty{
  public:
    TConstObjProperty(const T& t):Content(t){}
    ~TConstObjProperty() {}
 
  public:
    T& operator()()                { return Content; }
    const T& operator()() const   { return Content; }
 
    operator T*()                 { return &Content;}
    operator const T&()           { return Content; }
    T* operator->()               { return &Content;}
    const T& operator*()          { return Content; }
 
  private:
    void operator=(const TConstObjProperty<T>&){}
    TConstObjProperty(){}
 
  private:
    T& Content;
};
//------------------------------------------------------------------------------
// array simple type
template <class T,class I>
class TArrayProperty{
  public:
    class TSetter{
      public:
        I Index;
        operator T()         { return Content; }
        T operator=( T value){ Content[Index]= value; return Content[Index];}
        TSetter& operator=(const TSetter& val){Content=val.Content;return *this;}
      protected:
        T* Content;
    }Name;
    friend class TSetter;
 
    TArrayProperty(T* value)      { Name.Content = value;}
    TSetter& operator[]( I index) { Name.Index = index; return Name; }
 
  private:
    TArrayProperty<T,I>& operator=( const TArrayProperty<T,I>& ){ return *this; } // not allowed
};
//------------------------------------------------------------------------------
/// array read only array
template <class T,class I>
class TConstArrayProperty{
  public:
    class TGetter{
#if defined(BI_COMP_GNUC)
      friend class TConstArrayProperty;
#else
      friend TConstArrayProperty;
#endif
      public:
        I Index;
 
        T& operator()()              { return Content[Index]; }
        const T& operator()() const  { return Content[Index]; }
        operator T*()               { return &Content[Index];}
        operator const T&()         { return Content[Index]; }
        const T& operator*()        { return Content[Index]; }
 
      protected:
        T* Content;
    }Name;
    friend class TGetter;
 
    TConstArrayProperty(T* value)  { Name.Content = value;}
    TGetter& operator[](I index)   { Name.Index = index; return Name; }
  private:
    TConstArrayProperty<T,I>& operator=( const TConstArrayProperty<T,I>& ); // not allowed
    T* Content;
};
//------------------------------------------------------------------------------
/// array read only array
template <class T,class I>
class TConstObjArrayProperty
{
  public:
    class TGetter
  {
      public:
        I Index;
 
  T& operator()()
    { return Content[Index]; }
  const T& operator()() const
    { return Content[Index]; }
  operator T*()
    { return &Content[Index];}
  operator const T&()
    { return Content[Index]; }
  T* operator->()
    { return &Content[Index];}
  const T& operator*()
    { return Content[Index]; }
 
      protected:
        T* Content;
    }Name;
    friend class TGetter;
 
    TConstObjArrayProperty(T* value)  { Name.Content = value;}
    TGetter& operator[](I index)      { Name.Index = index; return Name; }
 
  private:
    TConstObjArrayProperty<T,I>& operator=( const TConstObjArrayProperty<T,I>&) { return *this; } // not allowed
};
//------------------------------------------------------------------------------
 
//
// Functors
//
template <class T>
class TFuncProperty{
  public:
    TFuncProperty(const TFunctor0<T> get, const TFunctorV1<T> put)
                 :Get(get),Put(put){}
    ~TFuncProperty() {}
 
  public:
    T operator()() const   { return Get(); }
    operator T()           { return Get(); }
    void operator()(const T& t) { Put(t); }
    TFuncProperty<T>& operator=(const T& t) { Put(t); return *this; }
 
  private:
    void operator=(const TFuncProperty<T>&){}
    TFuncProperty(){}
 
    TFunctor0<T>     Get;
    TFunctorV1<T>   Put;
};
 
//
// get/put object
//
template <class T>
class TFuncObjProperty{
  public:
    TFuncObjProperty(const TFunctor0<T&> get, const TFunctorV1<const T&> put)
                 :Get(get),Put(put){}
    ~TFuncObjProperty() {}
 
  public:
    // getters
    operator T*()              { return &Get(); }
    operator const T&() const  { return Get(); }
    T* operator->()            { return &Get();}
    const T& operator*()       { return Get(); }
 
    //set/get
    //T* operator=( T* t)        { return Put(t); return &Get();}
    T& operator=( T& t)        { Put(t); return Get(); }
    TFuncObjProperty<T>& operator=(const T& t){ Put(t); return *this; }
    //setters
    const T& operator()() const { return Get(); }
    void operator()(const T& t) { Put(t);}
 
  private:
    void operator=(const TFuncObjProperty<T>&){}
    TFuncObjProperty(){}
 
    TFunctor0<T&>         Get;
    TFunctorV1<const T&>   Put;
 
};
 
//
template <class T>
class TFuncPropertyGet{
  public:
    TFuncPropertyGet(const TFunctor0<T> get):Get(get){}
    ~TFuncPropertyGet() {}
 
  public:
    T operator()()              { return Get(); }
    const T operator()() const   { return Get(); }
 
  private:
    void operator=(const TFuncPropertyGet<T>&){}
    TFuncPropertyGet(){}
 
    TFunctor0<T>   Get;
};
 
//
template <class T>
class TFuncObjPropertyGet{
  public:
    TFuncObjPropertyGet(const TFunctor0<T&> get):Get(get){}
    ~TFuncObjPropertyGet() {}
 
  public:
    T& operator()()               { return Get(); }
    const T& operator()() const   { return Get(); }
    operator T*()                 { return &Get(); }
    operator const T&()           { return Get(); }
    T* operator->()               { return &Get();}
    const T& operator*()          { return Get(); }
 
  private:
    void operator=(const TFuncObjPropertyGet<T>&){}
    TFuncObjPropertyGet(){}
 
    TFunctor0<T&>  Get;
};
 
//
template <class T>
class TFuncPropertyPut{
  public:
    TFuncPropertyPut(const TFunctorV1<T> put):Put(put){}
    ~TFuncPropertyPut() {}
 
  public:
    void operator()(const T& t)                { Put(t);               }
    TFuncPropertyPut<T>& operator=(const T& t) { Put(t); return *this; }
 
  private:
    void operator=(const TFuncPropertyPut<T>&){}
    TFuncPropertyPut(){}
 
  TFunctorV1<T> Put;
};
 
//
template <class T>
class TFuncObjPropertyPut{
  public:
    TFuncObjPropertyPut(const TFunctorV1<const T&> put):Put(put){}
    ~TFuncObjPropertyPut() {}
 
  public:
    void operator()(const T& t)                   { Put(t);               }
    TFuncObjPropertyPut<T>& operator=(const T& t) { Put(t); return *this; }
 
  private:
    void operator=(const TFuncObjPropertyPut<T>&){}
    TFuncObjPropertyPut(){}
 
  TFunctorV1<const T&> Put;
};
 
//
template <class T>
class TFuncPropertyVarPut{
  public:
    TFuncPropertyVarPut(const T& var, const TFunctorV1<T> put)
                        :Content(var),Put(put){}
    ~TFuncPropertyVarPut(){}
 
  public:
    T operator()() const      { return Content; }
    operator T()               { return Content; }
 
    void operator()(const T& t) { Put(t); }
    TFuncPropertyVarPut<T>& operator=(const T& t) { Put(t); return *this; }
 
  private:
    void operator=(const TFuncPropertyVarPut<T>&);
    TFuncPropertyVarPut();
 
   const T&       Content;
  TFunctorV1<T> Put;
};
 
 
//
template <class T>
class TFuncObjPropertyVarPut{
  public:
    TFuncObjPropertyVarPut(T& var, const TFunctorV1<const T&> put)
                        :Content(&var),Put(put){}
    ~TFuncObjPropertyVarPut(){}
 
  public:
    // getter
    T& operator()()               { return *Content; }
    const T& operator()() const   { return *Content; }
    operator T*()                 { return Content;  }
    operator const T&()           { return *Content; }
    T* operator->()               { return Content;  }
    const T& operator*()          { return *Content; }
 
  public:
    //T* operator=( T* t)        { return Put(t); return &Content;}
    T& operator=( T& t)          { Put(t); return *Content; }
    TFuncObjPropertyVarPut<T>& operator=(const T& t) { Put(t); return *this; }
    void operator()(const T& t){ Put(t);}
 
  private:
    void operator=(const TFuncObjPropertyVarPut<T>&){}
    TFuncObjPropertyVarPut(){}
 
    TFunctorV1<const T&> Put;
     T* Content;
};
 
//
template <class T, int index>
class TFuncPropertyIdxGet{
  public:
    TFuncPropertyIdxGet(const TFunctor1<T,int> get):Get(get){}
    ~TFuncPropertyIdxGet() {}
 
  public:
    T operator()()              { return Get(index); }
    const T operator()() const   { return Get(index); }
 
  private:
    void operator=(const TFuncPropertyIdxGet<T,index>&){}
    TFuncPropertyIdxGet(){}
 
    TFunctor1<T,int>   Get;
};
 
//
template <class T, int index>
class TFuncObjPropertyIdxGet{
  public:
    TFuncObjPropertyIdxGet(const TFunctor1<T&,int> get):Get(get){}
    ~TFuncObjPropertyIdxGet() {}
 
  public:
    T& operator()()               { return Get(index); }
    const T& operator()() const   { return Get(index); }
    operator T*()                 { return &Get(index);}
    operator const T&()           { return Get(index); }
    T* operator->()               { return &Get(index);}
    const T& operator*()          { return Get(index); }
 
  private:
    void operator=(const TFuncObjPropertyIdxGet<T,index>&){}
    TFuncObjPropertyIdxGet(){}
 
  TFunctor1<T&,int> Get;
};
 
//
template <class T, int index>
class TFuncPropertyIdxPut{
  public:
    TFuncPropertyIdxPut(const TFunctorV2<int,T> put):Put(put){}
    ~TFuncPropertyIdxPut() {}
 
  public:
    void operator()(const T& t) { Put(index, t); }
    TFuncPropertyIdxPut<T,index>& operator=(const T& t) { Put(index,t); return *this; }
 
  private:
    void operator=(const TFuncPropertyIdxPut<T,index>&);
    TFuncPropertyIdxPut();
 
  TFunctorV2<int,T> Put;
};
 
//
template <class T, int index>
class TFuncObjPropertyIdxPut{
  public:
    TFuncObjPropertyIdxPut(const TFunctorV2<int,const T&> put):Put(put){}
    ~TFuncObjPropertyIdxPut() {}
 
  public:
    void operator()(const T& t) { Put(index, t); }
    TFuncObjPropertyIdxPut<T,index>& operator=(const T& t) { Put(index,t); return *this; }
 
  private:
    void operator=(const TFuncObjPropertyIdxPut<T,index>&);
    TFuncObjPropertyIdxPut();
 
  TFunctorV2<int,const T&> Put;
};
 
//
template <class T, int index>
class TFuncPropertyIdx{
  public:
    TFuncPropertyIdx(const TFunctor1<T,int> get,
                     const TFunctorV2<int,T> put):
                     Get(get),Put(put){}
    ~TFuncPropertyIdx() {}
 
  public:
    T operator()() const   { return Get(index); }
    operator T()           { return Get(index); }
 
    void operator()(const T& t) { Put(index, t); }
    TFuncPropertyIdx<T,index>& operator=(const T& t){Put(index,t);return *this;}
 
  private:
    void operator=(const TFuncPropertyIdx<T,index>&);
    TFuncPropertyIdx();
 
  TFunctor1<T,int>   Get;
  TFunctorV2<int,T>  Put;
};
 
//
template <class T, int index>
class TFuncObjPropertyIdx{
  public:
    TFuncObjPropertyIdx(const TFunctor1<T&,int> get,
                     const TFunctorV2<int,const T&> put):
                     Get(get),Put(put){}
    ~TFuncObjPropertyIdx() {}
 
  public:
    // getters
    operator T*()              { return &Get(index);}
    operator const T&() const { return Get(index); }
    T* operator->()           { return &Get(index);}
    const T& operator*()      { return Get(index); }
 
    //set/get
    //T* operator=( T* t)       { Put(index,t); return &Get(index);}
    T& operator=( T& t)       { Put(index,t); return Get(index); }
    TFuncObjPropertyIdx<T,index>& operator=(const T& t){ Put(index,t); return *this;}
 
    //setters
    const T& operator()() const  { return Get(index);  }
    void operator()(const T& t) { Put(index,t);}
 
  private:
    void operator=(const TFuncObjPropertyIdx<T,index>&){}
    TFuncObjPropertyIdx(){}
 
    TFunctor1<T&,int>          Get;
    TFunctorV2<int,const T&>  Put;
};
 
// support macros
//
#define GETFUNCTOR(T,func) \
        Functor((TFunctor0<T>*)0, func)
#define PUTFUNCTOR(T,func) \
        Functor((TFunctorV1<T>*)0, func)
#define GETPUTFUNCTOR(T,funcGet,funcPut) \
        Functor((TFunctor0<T>*)0, funcGet),\
        Functor((TFunctorV1<T>*)0, funcPut)
//
#define GETOBJFUNCTOR(T,func) \
        Functor((TFunctor0<T&>*)0, func)
#define PUTOBJFUNCTOR(T,func) \
        Functor((TFunctorV1<const T&>*)0, func)
#define GETPUTOBJFUNCTOR(T,funcGet,funcPut) \
        Functor((TFunctor0<T&>*)0, funcGet),\
        Functor((TFunctorV1<const T&>*)0, funcPut)
//
#define GETMFUNCTOR(T,type,memberFunc) \
        Functor((TFunctor0<T>*)0, *this, &type::memberFunc)
#define PUTMFUNCTOR(T,type,memberFunc) \
        Functor((TFunctorV1<T>*)0, *this, &type::memberFunc)
#define GETPUTMFUNCTOR(T,type,memberGet,memberPut) \
        Functor((TFunctor0<T>*)0, *this, &type::memberGet),\
        Functor((TFunctorV1<T>*)0, *this, &type::memberPut)
 
#define GETOBJMFUNCTOR(T,type,memberFunc) \
        Functor((TFunctor0<T&>*)0, *this, &type::memberFunc)
#define PUTOBJMFUNCTOR(T,type,memberFunc) \
        Functor((TFunctorV1<const T&>*)0, *this, &type::memberFunc)
#define GETPUTOBJMFUNCTOR(T,type,memberGet,memberPut) \
        Functor((TFunctor0<T&>*)0, *this, &type::memberGet),\
        Functor((TFunctorV1<const T&>*)0, *this, &type::memberPut)
//
#define IDXGETFUNCTOR(T,func) \
        Functor((TFunctor1<T,int>*)0, func)
#define IDXPUTFUNCTOR(T,func) \
        Functor((TFunctorV2<int,T>*)0, func)
#define IDXGETPUTFUNCTOR(T,funcGet,funcPut) \
        Functor((TFunctor1<T,int>*)0, funcGet),\
        Functor((TFunctorV2<int,T>*)0, funcPut)
#define IDXGETPUTOBJFUNCTOR(T,funcGet,funcPut) \
        Functor((TFunctor1<T&,int>*)0, funcGet),\
        Functor((TFunctorV2<int,const T&>*)0, funcPut)
//
#define IDXGETMFUNCTOR(T,type,memberFunc) \
        Functor((TFunctor1<T,int>*)0, *this, &type::memberFunc)
#define IDXPUTMFUNCTOR(T,type,memberFunc) \
        Functor((TFunctorV2<int,T>*)0, *this, &type::memberFunc)
#define IDXGETPUTMFUNCTOR(T,type,memberGet,memberPut) \
        Functor((TFunctor1<T,int>*)0, *this, &type::memberGet),\
        Functor((TFunctorV2<int,T>*)0, *this, &type::memberPut)
#define IDXGETPUTOBJMFUNCTOR(T,type,memberGet,memberPut) \
        Functor((TFunctor1<T,int>*)0, *this, &type::memberGet),\
        Functor((TFunctorV2<int,const T&>*)0, *this, &type::memberPut)
 
/// @}
 
/// \cond NoSuppressDoxygenWarning
#include <owl/posclass.h>
/// \endcond
 
//
// inlines
//
 
// TObjProperty inlines
//
template <class T> inline
TObjProperty<T>::TObjProperty(const T& t)
{
  Content = new T(t);
}
 
template <class T> inline
TObjProperty<T>::TObjProperty(T* t)
:
  Content(t)
{
}
 
//
template <class T> inline
TObjProperty<T>::TObjProperty()
:
  Content(0)
{
}
 
//
template <class T> inline
TObjProperty<T>::~TObjProperty()
{
  delete Content;
}
 
//
template <class T> inline
TObjProperty<T>::operator T*()
{
  return Content;
}
 
//
template <class T> inline
TObjProperty<T>::operator const T&() const
{
  PRECONDITION(Content);
  return *Content;
}
 
//
template <class T> inline T*
TObjProperty<T>::operator->()
{
  return Content;
}
 
//
template <class T> inline const T&
TObjProperty<T>::operator*()
{
  PRECONDITION(Content);
  return *Content;
}
 
//
template <class T> inline T*
TObjProperty<T>::operator=( T* t)
{
  delete Content;
  Content = t;
  return Content;
}
 
//
template <class T> inline T&
TObjProperty<T>::operator=( T& t)
{
  delete Content;
  Content = new T(t);
  return *Content;
}
 
//
template <class T> inline const T&
TObjProperty<T>::operator()() const
{
  PRECONDITION(Content);
  return *Content;
}
 
//
template <class T> inline void
TObjProperty<T>::operator()(const T& t)
{
  delete Content;
  Content = new T(t);
}
 
//
template <class T> inline TObjProperty<T>&
TObjProperty<T>::operator=(const T& t)
{
  delete Content;
  Content = new T(t);
  return *this;
}
 
} // OWL namespace
 
//------------------------------------------------------------------------------
#endif

V690 The copy assignment operator is declared as private in the 'TObjProperty' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V690 The 'TSetter' class implements the copy assignment operator, but lacks a copy constructor. It is dangerous to use such a class.

V690 The copy assignment operator is declared as private in the 'TConstArrayProperty' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V690 The copy assignment operator is declared as private in the 'TFuncObjPropertyVarPut' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V730 Not all members of a class are initialized inside the constructor. Consider inspecting: Content.

V690 The copy assignment operator is declared as private in the 'TProperty' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V690 The copy assignment operator is declared as private in the 'TConstProperty' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V690 The copy assignment operator is declared as private in the 'TConstObjProperty' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V690 The copy assignment operator is declared as private in the 'TArrayProperty' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V690 The copy assignment operator is declared as private in the 'TConstObjArrayProperty' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V690 The copy assignment operator is declared as private in the 'TFuncProperty' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V690 The copy assignment operator is declared as private in the 'TFuncObjProperty' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V690 The copy assignment operator is declared as private in the 'TFuncPropertyGet' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V690 The copy assignment operator is declared as private in the 'TFuncObjPropertyGet' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V690 The copy assignment operator is declared as private in the 'TFuncPropertyPut' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V690 The copy assignment operator is declared as private in the 'TFuncObjPropertyPut' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V690 The copy assignment operator is declared as private in the 'TFuncPropertyVarPut' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V690 The copy assignment operator is declared as private in the 'TFuncPropertyIdxGet' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V690 The copy assignment operator is declared as private in the 'TFuncObjPropertyIdxGet' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V690 The copy assignment operator is declared as private in the 'TFuncPropertyIdxPut' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V690 The copy assignment operator is declared as private in the 'TFuncObjPropertyIdxPut' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V690 The copy assignment operator is declared as private in the 'TFuncPropertyIdx' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V690 The copy assignment operator is declared as private in the 'TFuncObjPropertyIdx' class, but the default copy constructor will still be generated by compiler. It is dangerous to use such a class.

V801 Decreased performance. It is better to redefine the first function argument as a reference. Consider replacing 'const .. get' with 'const .. &get'.

V801 Decreased performance. It is better to redefine the second function argument as a reference. Consider replacing 'const .. put' with 'const .. &put'.

V801 Decreased performance. It is better to redefine the first function argument as a reference. Consider replacing 'const .. get' with 'const .. &get'.

V801 Decreased performance. It is better to redefine the second function argument as a reference. Consider replacing 'const .. put' with 'const .. &put'.

V801 Decreased performance. It is better to redefine the first function argument as a reference. Consider replacing 'const .. get' with 'const .. &get'.

V801 Decreased performance. It is better to redefine the first function argument as a reference. Consider replacing 'const .. get' with 'const .. &get'.

V801 Decreased performance. It is better to redefine the first function argument as a reference. Consider replacing 'const .. put' with 'const .. &put'.

V801 Decreased performance. It is better to redefine the first function argument as a reference. Consider replacing 'const .. put' with 'const .. &put'.

V801 Decreased performance. It is better to redefine the second function argument as a reference. Consider replacing 'const .. put' with 'const .. &put'.

V801 Decreased performance. It is better to redefine the second function argument as a reference. Consider replacing 'const .. put' with 'const .. &put'.

V801 Decreased performance. It is better to redefine the first function argument as a reference. Consider replacing 'const .. get' with 'const .. &get'.

V801 Decreased performance. It is better to redefine the first function argument as a reference. Consider replacing 'const .. get' with 'const .. &get'.

V801 Decreased performance. It is better to redefine the first function argument as a reference. Consider replacing 'const .. put' with 'const .. &put'.

V801 Decreased performance. It is better to redefine the first function argument as a reference. Consider replacing 'const .. put' with 'const .. &put'.

V801 Decreased performance. It is better to redefine the first function argument as a reference. Consider replacing 'const .. get' with 'const .. &get'.

V801 Decreased performance. It is better to redefine the second function argument as a reference. Consider replacing 'const .. put' with 'const .. &put'.

V801 Decreased performance. It is better to redefine the first function argument as a reference. Consider replacing 'const .. get' with 'const .. &get'.

V801 Decreased performance. It is better to redefine the second function argument as a reference. Consider replacing 'const .. put' with 'const .. &put'.

V832 It's better to use '= default;' syntax instead of empty constructor body.

V832 It's better to use '= default;' syntax instead of empty destructor body.

V832 It's better to use '= default;' syntax instead of empty destructor body.

V832 It's better to use '= default;' syntax instead of empty destructor body.

V832 It's better to use '= default;' syntax instead of empty constructor body.

V832 It's better to use '= default;' syntax instead of empty destructor body.

V832 It's better to use '= default;' syntax instead of empty constructor body.

V832 It's better to use '= default;' syntax instead of empty destructor body.

V832 It's better to use '= default;' syntax instead of empty constructor body.

V832 It's better to use '= default;' syntax instead of empty destructor body.

V832 It's better to use '= default;' syntax instead of empty constructor body.

V832 It's better to use '= default;' syntax instead of empty destructor body.

V832 It's better to use '= default;' syntax instead of empty constructor body.

V832 It's better to use '= default;' syntax instead of empty destructor body.

V832 It's better to use '= default;' syntax instead of empty constructor body.

V832 It's better to use '= default;' syntax instead of empty destructor body.

V832 It's better to use '= default;' syntax instead of empty constructor body.

V832 It's better to use '= default;' syntax instead of empty destructor body.

V832 It's better to use '= default;' syntax instead of empty destructor body.

V832 It's better to use '= default;' syntax instead of empty constructor body.

V832 It's better to use '= default;' syntax instead of empty destructor body.

V832 It's better to use '= default;' syntax instead of empty constructor body.

V832 It's better to use '= default;' syntax instead of empty destructor body.

V832 It's better to use '= default;' syntax instead of empty constructor body.

V832 It's better to use '= default;' syntax instead of empty destructor body.

V832 It's better to use '= default;' syntax instead of empty destructor body.

V832 It's better to use '= default;' syntax instead of empty destructor body.

V832 It's better to use '= default;' syntax instead of empty destructor body.

V832 It's better to use '= default;' syntax instead of empty constructor body.