Boost logo

Boost :

From: Sergey Sadovnikov (flex_ferrum_at_[hidden])
Date: 2008-07-09 16:29:36

Hello All,

Would there be any interest in another C++ properties implementation?
I know that boost sandbox already contains properties library. But I
can offer another implementation of such library with some advantages
like this:
 - Simple properties set initialization. Only one call from the

   class SomeClass
         SomeClass() : properties__(this) {/*...*/}

 - Many kins of properties. Now implemented:
   Simple properties similar to datamembers.
   Properties bindable to getter/setter methods of container class.
   Properties bindable to arbitrary methods.
   Index properties with up to three levels of indirection.

 - Properties could be "abstract" and need implementation in derived

 - In-place initialization of simple properties. For example:
         PROPERTY_I(int, ContainerSize, 10)

 - Generic runtime access to the properties via names:
         SomeClassWithProps c;

         int val;
         c.properties__.invoke_get("ContainerSize", var(val) =

         c.properties__.invoke_set("ContainerSize", 20);

 - Runtime enumeration of properties:
   // Property visitor function
   template<typename P>
   void PropertyEnumerator(const std::string& propertyName, P
      SomeClassWithProps::* propInfo)

   // Properties enumeration:

 - Simple serialization of properties:
   template<typename Ar>
   void serialize(Ar& ar, const unsigned int ver)
        ar & properties__;

 - Quite simple definition in class. A piece of code from real
// Example of abstract properties definition in the base class:
class IPlayerCraft : public IAirObject

        IPlayerCraft() : properties__(this) {;}
        virtual ~IPlayerCraft(){}

        // Craft status
        enum ECRAFTSTATUS
                csREADY =0,

                // Craft name
                ABSTRACT_RW_PROPERTY(std::wstring, Name)
                // Static craft info
                ABSTRACT_RO_PROPERTY(SCraftInfo const*, Info)
                // Craft home base
                ABSTRACT_RO_PROPERTY(IBase const*, HomeBase)
                // Is craft on the base?
                ABSTRACT_RO_PROPERTY(bool, IsOnTheBase)
                // Craft status
                // Current craft speed
                ABSTRACT_RO_PROPERTY(TPARAM, Speed)
                // Craft weapon
                ABSTRACT_INDEX_PROPERTY(IItem*, CraftWeapon, 1, (CraftSlotCoord))
                // Craft weapon ammo
                ABSTRACT_RO_INDEX_PROPERTY(TPARAM, CraftWeaponAmmo, 1, (CraftSlotCoord))

// Implementation class
class PlayerCraft : public IPlayerCraft
        PlayerCraft(SCraftInfo const*, Player* player);

                IMPLEMENT_PROPERTY(IPlayerCraft, PROPERTY(std::wstring, Name))
                IMPLEMENT_PROPERTY(IPlayerCraft, PROPERTY(SCraftInfo const*, Info))
                IMPLEMENT_PROPERTY(IPlayerCraft, RO_PROPERTY(IBase const*, HomeBase, GetHomeBase))
                IMPLEMENT_PROPERTY(IPlayerCraft, PROPERTY(bool, IsOnTheBase))
                IMPLEMENT_PROPERTY(IPlayerCraft, PROPERTY_I(TPARAM, Speed, 0))
                IMPLEMENT_PROPERTY(IPlayerCraft, INDEX_PROPERTY(IItem*, CraftWeapon, 1, (CraftSlotCoord), GetCraftWeapon, SetCraftWeapon))
                IMPLEMENT_PROPERTY(IPlayerCraft, RO_INDEX_PROPERTY(TPARAM, CraftWeaponAmmo, 1, (CraftSlotCoord), GetCraftWeaponAmmo))

        // ...
        IBase const* GetHomeBase() const {return m_HomeBase;}
        // ...
        IItem* GetCraftWeapon(int slotId) const;
        void SetCraftWeapon(int slotId, IItem* weapon);
        TPARAM GetCraftWeaponAmmo(int slotId) const;

As you can see, properties definition based on boost::preprocessor.
It allows to implement quite complex background (with many special
abilities) for quite simple front-end.

It is assumed what access to the properties in many cases is same as
access to the datamember:
PlayerCraft craft;

std::string craft_name = craft.Name;

IItem* weapon = craft.CraftWeapon[1];

And there is special access form needs in some cases:

If there is an interest in such properties implementation I could
start prepare code for formal library review.

Best Regards,
 Sergey                          mailto:flex_ferrum_at_[hidden]

Boost list run by bdawes at, gregod at, cpdaniel at, john at