imgtools/imglib/boostlibrary/boost/regex/pending/object_cache.hpp
author jjkang
Fri, 25 Jun 2010 18:11:34 +0800
changeset 600 6d08f4a05d93
permissions -rw-r--r--
add deprecated files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
600
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     1
/*
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     2
 *
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     3
 * Copyright (c) 2004
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     4
 * John Maddock
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     5
 *
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     6
 * Use, modification and distribution are subject to the 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     7
 * Boost Software License, Version 1.0. (See accompanying file 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     8
 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     9
 *
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    10
 */
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    11
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    12
 /*
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    13
  *   LOCATION:    see http://www.boost.org for most recent version.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    14
  *   FILE         object_cache.hpp
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    15
  *   VERSION      see <boost/version.hpp>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    16
  *   DESCRIPTION: Implements a generic object cache.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    17
  */
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    18
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    19
#ifndef BOOST_REGEX_OBJECT_CACHE_HPP
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    20
#define BOOST_REGEX_OBJECT_CACHE_HPP
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    21
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    22
#include <map>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    23
#include <list>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    24
#include <stdexcept>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    25
#include <string>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    26
#include <boost/config.hpp>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    27
#include <boost/shared_ptr.hpp>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    28
#ifdef BOOST_HAS_THREADS
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    29
#include <boost/regex/pending/static_mutex.hpp>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    30
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    31
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    32
namespace boost{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    33
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    34
template <class Key, class Object>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    35
class object_cache
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    36
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    37
public:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    38
   typedef std::pair< ::boost::shared_ptr<Object const>, Key const*> value_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    39
   typedef std::list<value_type> list_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    40
   typedef typename list_type::iterator list_iterator;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    41
   typedef std::map<Key, list_iterator> map_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    42
   typedef typename map_type::iterator map_iterator;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    43
   typedef typename list_type::size_type size_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    44
   static boost::shared_ptr<Object const> get(const Key& k, size_type max_cache_size);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    45
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    46
private:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    47
   static boost::shared_ptr<Object const> do_get(const Key& k, size_type max_cache_size);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    48
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    49
   struct data
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    50
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    51
      list_type   cont;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    52
      map_type    index;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    53
   };
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    54
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    55
   // Needed by compilers not implementing the resolution to DR45. For reference,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    56
   // see http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#45.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    57
   friend struct data;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    58
};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    59
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    60
template <class Key, class Object>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    61
boost::shared_ptr<Object const> object_cache<Key, Object>::get(const Key& k, size_type max_cache_size)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    62
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    63
#ifdef BOOST_HAS_THREADS
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    64
   static boost::static_mutex mut = BOOST_STATIC_MUTEX_INIT;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    65
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    66
   boost::static_mutex::scoped_lock l(mut);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    67
   if(l)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    68
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    69
      return do_get(k, max_cache_size);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    70
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    71
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    72
   // what do we do if the lock fails?
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    73
   // for now just throw, but we should never really get here...
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    74
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    75
   ::boost::throw_exception(std::runtime_error("Error in thread safety code: could not acquire a lock"));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    76
   return boost::shared_ptr<Object>();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    77
#else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    78
   return do_get(k, max_cache_size);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    79
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    80
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    81
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    82
template <class Key, class Object>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    83
boost::shared_ptr<Object const> object_cache<Key, Object>::do_get(const Key& k, size_type max_cache_size)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    84
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    85
   typedef typename object_cache<Key, Object>::data object_data;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    86
   typedef typename map_type::size_type map_size_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    87
   static object_data s_data;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    88
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    89
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    90
   // see if the object is already in the cache:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    91
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    92
   map_iterator mpos = s_data.index.find(k);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    93
   if(mpos != s_data.index.end())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    94
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    95
      //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    96
      // Eureka! 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    97
      // We have a cached item, bump it up the list and return it:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    98
      //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    99
      if(--(s_data.cont.end()) != mpos->second)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   100
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   101
         // splice out the item we want to move:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   102
         list_type temp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   103
         temp.splice(temp.end(), s_data.cont, mpos->second);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   104
         // and now place it at the end of the list:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   105
         s_data.cont.splice(s_data.cont.end(), temp, temp.begin());
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   106
         BOOST_ASSERT(*(s_data.cont.back().second) == k);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   107
         // update index with new position:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   108
         mpos->second = --(s_data.cont.end());
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   109
         BOOST_ASSERT(&(mpos->first) == mpos->second->second);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   110
         BOOST_ASSERT(&(mpos->first) == s_data.cont.back().second);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   111
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   112
      return s_data.cont.back().first;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   113
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   114
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   115
   // if we get here then the item is not in the cache,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   116
   // so create it:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   117
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   118
   boost::shared_ptr<Object const> result(new Object(k));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   119
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   120
   // Add it to the list, and index it:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   121
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   122
   s_data.cont.push_back(value_type(result, static_cast<Key const*>(0)));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   123
   s_data.index.insert(std::make_pair(k, --(s_data.cont.end())));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   124
   s_data.cont.back().second = &(s_data.index.find(k)->first);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   125
   map_size_type s = s_data.index.size();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   126
   BOOST_ASSERT(s_data.index[k]->first.get() == result.get());
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   127
   BOOST_ASSERT(&(s_data.index.find(k)->first) == s_data.cont.back().second);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   128
   BOOST_ASSERT(s_data.index.find(k)->first == k);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   129
   if(s > max_cache_size)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   130
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   131
      //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   132
      // We have too many items in the list, so we need to start
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   133
      // popping them off the back of the list, but only if they're
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   134
      // being held uniquely by us:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   135
      //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   136
      list_iterator pos = s_data.cont.begin();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   137
      list_iterator last = s_data.cont.end();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   138
      while((pos != last) && (s > max_cache_size))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   139
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   140
         if(pos->first.unique())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   141
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   142
            list_iterator condemmed(pos);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   143
            ++pos;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   144
            // now remove the items from our containers, 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   145
            // then order has to be as follows:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   146
            BOOST_ASSERT(s_data.index.find(*(condemmed->second)) != s_data.index.end());
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   147
            s_data.index.erase(*(condemmed->second));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   148
            s_data.cont.erase(condemmed); 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   149
            --s;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   150
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   151
         else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   152
            --pos;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   153
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   154
      BOOST_ASSERT(s_data.index[k]->first.get() == result.get());
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   155
      BOOST_ASSERT(&(s_data.index.find(k)->first) == s_data.cont.back().second);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   156
      BOOST_ASSERT(s_data.index.find(k)->first == k);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   157
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   158
   return result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   159
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   160
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   161
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   162
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   163
#endif