src/core/singleton.h
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Sat, 04 Jul 2009 08:15:48 +0200
changeset 4654 2eaebe77d66b
parent 2834 1aab57845b07
permissions -rw-r--r--
Added tag ns-3.5 for changeset c975274c9707
     1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
     2 /*
     3  * Copyright (c) 2007 INRIA
     4  *
     5  * This program is free software; you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License version 2 as
     7  * published by the Free Software Foundation;
     8  *
     9  * This program is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License
    15  * along with this program; if not, write to the Free Software
    16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    17  *
    18  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
    19  */
    20 #ifndef SINGLETON_H
    21 #define SINGLETON_H
    22 
    23 namespace ns3 {
    24 
    25 /**
    26  * \brief a template singleton
    27  *
    28  * This template class can be used to implement the singleton pattern.
    29  * The underlying object will be destroyed automatically when the process
    30  * exits. Note that, if you call Singleton::Get again after the object has
    31  * been destroyed, the object will be re-created which will result in a
    32  * memory leak as reported by most memory leak checkers. It is up to the
    33  * user to ensure that Singleton::Get is never called from a static variable
    34  * finalizer.
    35  */
    36 template <typename T>
    37 class Singleton
    38 {
    39 public:
    40   static T *Get (void);
    41 
    42 };
    43 
    44 } // namespace ns3
    45 
    46 namespace ns3 {
    47 
    48 template <typename T>
    49 T *
    50 Singleton<T>::Get (void)
    51 {
    52   static T object;
    53   return &object;
    54 }
    55 
    56 
    57 } // namespace ns3
    58 
    59 #endif /* SINGLETON_H */