IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Handle-based resource manager


Sujet :

Langage C++

  1. #1
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut Handle-based resource manager
    Bonjour à tous

    En cherchant des articles sur la gestion de ressources (principalement orienté jeux vidéos) je suis tombé sur celui-ci

    Generic handle-based resource manager

    C'est un article qui a été publié dans le livre Game Programming Gems 1.

    Cependant il y a une partie du code que je ne comprend pas, précisemment la class Handle dont voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
        template <typename TAG>
        class Handle
        {
            union
            {
                enum
                {
                    // Sizes to use for bit fields
                    MAX_BITS_INDEX = 16,
                    MAX_BITS_MAGIC = 16,
     
                    // Sizes to compare against for asserting dereferences
                    MAX_INDEX = ( 1 << MAX_BITS_INDEX) - 1,
                    MAX_MAGIC = ( 1 << MAX_BITS_MAGIC) - 1
                };
     
                struct
                {
                    unsigned m_Index : MAX_BITS_INDEX;  // Index into resource array
                    unsigned m_Magic : MAX_BITS_MAGIC;  // Magic number to check
                };
     
                unsigned int m_uiHandle;
            };
     
        public:
     
            // Lifetime.
     
            Handle():
                m_uiHandle( 0 )
            {}
     
            void Init(unsigned int _Index);
     
            // Query.
     
            unsigned int GetIndex ( void ) const  {  return (  m_Index  );  }
            unsigned int GetMagic ( void ) const  {  return (  m_Magic  );  }
            unsigned int GetHandle( void ) const  {  return (  m_uiHandle );  }
            bool         IsNull   ( void ) const  {  return ( !m_uiHandle );  }
     
            operator unsigned int ( void ) const  {  return (  m_uiHandle );  }
        };
     
        //-------------------------------------------------------------------
        template <typename TAG>
        void Handle<TAG>::Init(unsigned int _Index)
        {
            assert( IsNull() );             // don't allow reassignment
            assert( _Index <= MAX_INDEX );   // verify range
     
            static unsigned int s_uiAutoMagic = 0;
            if ( ++s_uiAutoMagic > MAX_MAGIC )
            {
                qDebug() << "restart";
                s_uiAutoMagic = 1;    // 0 is used for "null handle"
            }
     
            //qDebug() << MAX_MAGIC;
     
            m_Index = _Index;
            m_Magic = s_uiAutoMagic;
        }
     
        //-------------------------------------------------------------------
        template <typename TAG>
        inline bool operator != ( Handle <TAG> l, Handle <TAG> r )
        {
            return ( l.GetHandle() != r.GetHandle() );
        }
     
        //-------------------------------------------------------------------
        template <typename TAG>
        inline bool operator == ( Handle <TAG> l, Handle <TAG> r )
        {
            return ( l.GetHandle() == r.GetHandle() );
        }
    Tout d'abord comment doit-on interpréter cette ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned m_Index : MAX_BITS_INDEX;
    Deuxièmement comment la propriété m_uiHandle peut elle avoir une valeur différentes à chaque instantiation d'un objet Handle alors que celle-ci n'est jamais écrite ?

    Kromagg
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  2. #2
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par Kromagg Voir le message

    Tout d'abord comment doit-on interpréter cette ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned m_Index : MAX_BITS_INDEX;
    Le ':' indique que l'on veut preciser le nombre de bits que va prendre la variable. Ca s'apelle un champs de bits, autrement dis "bit field".
    Autrement dis on force m_Index a etre un entier non signe de 16bits.


    Deuxièmement comment la propriété m_uiHandle peut elle avoir une valeur différentes à chaque instantiation d'un objet Handle alors que celle-ci n'est jamais écrite ?
    Il faut faire attention au fait qu'il y a une union ici. Autrement dis, m_uiHandle occupe exactement le meme espace memoire occupe par l'ensemble m_Index et m_Magic. Si on change l'un de ces deux derniers, ca va changer m_uiHandle. C'est pour permettre d'avoir le handle en une seule valeur, mais de facilement avoir acces aux deux parties constituant cette valeur (pour aider les recherches j'imagine).
    Comme m_Index et m_Magic sont generes dans la fonction Init(), en utilisant un compteur statique pour avoir une valeur differente de m_Magic a chaque appel, alors on obtiens differentes valeurs a chaque fois pour m_uiHandle.

    Donc mot clee a chercher pour mieu comprendre: "union" et "bit field"

    Note, au cas ou, que la fonction init n'est pas thread-safe, ce qui peut ou pas etre un probleme.

Discussions similaires

  1. Configuration de Resources Manager
    Par ricoflashfire dans le forum Administration
    Réponses: 2
    Dernier message: 03/11/2009, 18h12
  2. Handle d'objet managé c# 1.1
    Par chental dans le forum C#
    Réponses: 7
    Dernier message: 16/04/2009, 22h34
  3. [10g R2] Resource manager/scheduler
    Par jokos2000 dans le forum Oracle
    Réponses: 0
    Dernier message: 26/10/2007, 11h16
  4. Gestion base Express Manager
    Par Ste20 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 28/09/2007, 12h50
  5. Réponses: 1
    Dernier message: 15/02/2007, 18h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo