00001 // -*- C++ -*- 00002 00003 // PLearn (A C++ Machine Learning Library) 00004 // Copyright (C) 1998 Pascal Vincent 00005 // Copyright (C) 1999-2002 Pascal Vincent, Yoshua Bengio and University of Montreal 00006 // 00007 00008 // Redistribution and use in source and binary forms, with or without 00009 // modification, are permitted provided that the following conditions are met: 00010 // 00011 // 1. Redistributions of source code must retain the above copyright 00012 // notice, this list of conditions and the following disclaimer. 00013 // 00014 // 2. Redistributions in binary form must reproduce the above copyright 00015 // notice, this list of conditions and the following disclaimer in the 00016 // documentation and/or other materials provided with the distribution. 00017 // 00018 // 3. The name of the authors may not be used to endorse or promote 00019 // products derived from this software without specific prior written 00020 // permission. 00021 // 00022 // THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 00023 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 00024 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 00025 // NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 00026 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 00027 // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00028 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00029 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00030 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00031 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00032 // 00033 // This file is part of the PLearn library. For more information on the PLearn 00034 // library, go to the PLearn Web site at www.plearn.org 00035 00036 #include <string> 00037 00038 #include "MRUFileList.h" 00039 00040 namespace PLearn { 00041 00042 MRUFileList::MRUFileList(int _max_opened_files, ios_base::openmode _mode) 00043 :max_opened_files(_max_opened_files),tot_miss(0),tot_access(0),mode(_mode) 00044 {} 00045 00046 ofstream * MRUFileList::getFile(string fname) 00047 00048 { 00049 tot_access++; 00050 list_typ::iterator it = mru_list.end(); 00051 ofstream * ofile; 00052 00053 // search for the wanted file in the MRU list 00054 for(list_typ::iterator it2 = mru_list.begin(); it2 != mru_list.end(); ++it2) 00055 if(it2->first == fname) 00056 { 00057 it=it2; 00058 break; 00059 } 00060 00061 // the file is not currently opened. 00062 if(it == mru_list.end()) 00063 { 00064 tot_miss++; 00065 // If we have already the max of opened files, we close the least recently used 00066 if((signed)mru_list.size() >= max_opened_files) 00067 { 00068 (mru_list.back().second)->close(); 00069 delete (mru_list.back().second); 00070 mru_list.pop_back(); 00071 } 00072 ofile = new ofstream(fname.c_str(),mode); 00073 if(ofile->bad()) 00074 { 00075 error="Could not open/create file "+fname+"."; 00076 return NULL; 00077 } 00078 mru_list.push_front(make_pair(fname,ofile)); 00079 return ofile; 00080 } 00081 00082 // else, we move the file to the top of the list and return the associated ofstream ptr 00083 00084 ofile=it->second; 00085 mru_list.erase(it); 00086 mru_list.push_front(make_pair(fname,ofile)); 00087 return ofile; 00088 } 00089 00090 MRUFileList::~MRUFileList() 00091 { 00092 for(list_typ::iterator it = mru_list.begin(); it != mru_list.end(); ++it) 00093 { 00094 (it->second)->close(); 00095 delete it->second; 00096 } 00097 } 00098 00099 } //end of namespace PLearn