This file is indexed.

/usr/include/claw/factory.hpp is in libclaw-dev 1.7.3-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*
  CLAW - a C++ Library Absolutely Wonderful

  CLAW is a free library without any particular aim but being useful to 
  anyone.

  Copyright (C) 2005-2011 Julien Jorge

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

  contact: julien.jorge@gamned.org
*/
/**
 * \file factory.hpp
 * \brief The design pattern of the factory.
 * \author Julien Jorge
 */
#ifndef __CLAW_FACTORY_HPP__
#define __CLAW_FACTORY_HPP__

#ifdef CLAW_FACTORY_IS_SINGLETON
#include <claw/basic_singleton.hpp>
#endif

#include <claw/exception.hpp>
#include <map>

namespace claw
{
  namespace pattern
  {
    /**
     * \brief Exception thrown when an incorrect identifier is given to a type.
     * \author Julien Jorge
     */
    class bad_type_identifier:
      public exception
    {
    public:
      /**
       * \brief Constructor.
       */
      bad_type_identifier() throw()
        : exception("No type has this identifier.")
      { }
    }; // class bad_type_identifier

    /**
     * \brief The design pattern of the factory allow to dynamically instanciate
     *        classes of various types given an identifier of this type.
     *
     * \b Template \b parameters:
     * - \a BaseClass A base class for all classes instanciated by this factory.
     * - \a IdentifierType The type of the identifiers of the classes
     *   instanciated by this factory.
     *
     * \b Type \b requirements:
     * - IdentifierType must be "less than" comparable.
     */
    template<typename BaseClass, typename IdentifierType>
#ifdef CLAW_FACTORY_IS_SINGLETON
    class factory:
      public basic_singleton< factory<BaseClass, IdentifierType> >
#else
    class factory
#endif
    {
    private:
      /**
       * \brief A class creator is an object that allocate a given type. This is
       *        the base class for all class creators.
       */
      class class_creator_base
      {
      public:
        virtual ~class_creator_base();
        virtual BaseClass* create() const = 0;

      }; // class class_creator_base

      /**
       * \brief A class creator is an object that allocate a given type.
       *
       * \b Template \b parameters:
       * - \a Derived The type of the class to instanciate.
       *
       * \b Type \b requirements:
       * - Derived must be default constructible.
       */
      template<typename Derived>
      class class_creator:
        public class_creator_base
      {
      public:
        virtual Derived* create() const;

      }; // class class_creator

      /** \brief The type of the data used to identify a class. */
      typedef IdentifierType identifier_type;

      /** \brief A base class for all instances created by this factory. */
      typedef BaseClass base_class;

      /** \brief The association identifier <-> type. */
      typedef std::map<identifier_type, class_creator_base*> class_map;

    public:
      ~factory();

      template<typename T>
      bool register_type( const identifier_type& id );

      base_class* create( const identifier_type& id ) const;

      bool is_known_type( const identifier_type& id ) const;

    private:
      /** \brief The association identifier <-> type. */
      class_map m_classes;

    }; // class factory

  } // namespace pattern
} // namespace claw

#include <claw/impl/factory.tpp>

#endif // __CLAW_FACTORY_HPP__