@@ -47,6 +47,7 @@ namespace ESM
4747 {
4848 it->mReader .open (*it->mName );
4949 it->mName .reset ();
50+ it->mFileSize .reset ();
5051 }
5152 mBusyItems .splice (mBusyItems .end (), mClosedItems , it);
5253 break ;
@@ -57,6 +58,46 @@ namespace ESM
5758 return BusyItem (*this , it);
5859 }
5960
61+ const std::filesystem::path& ReadersCache::getName (std::size_t index) const
62+ {
63+ const auto indexIt = mIndex .find (index);
64+ if (indexIt == mIndex .end ())
65+ throw std::logic_error (" ESMReader at index " + std::to_string (index) + " has not been created yet" );
66+ switch (indexIt->second ->mState )
67+ {
68+ case State::Busy:
69+ case State::Free:
70+ return indexIt->second ->mReader .getName ();
71+ case State::Closed:
72+ if (indexIt->second ->mName )
73+ return *indexIt->second ->mName ;
74+ throw std::logic_error (" ESMReader at index " + std::to_string (index) + " has forgotten its filename" );
75+ default :
76+ throw std::logic_error (" ESMReader at index " + std::to_string (index) + " in unknown state" );
77+ }
78+ }
79+
80+ std::size_t ReadersCache::getFileSize (std::size_t index)
81+ {
82+ const auto indexIt = mIndex .find (index);
83+ if (indexIt == mIndex .end ())
84+ return 0 ;
85+ switch (indexIt->second ->mState )
86+ {
87+ case State::Busy:
88+ case State::Free:
89+ if (!indexIt->second ->mReader .getName ().empty ())
90+ return indexIt->second ->mReader .getFileSize ();
91+ throw std::logic_error (" ESMReader at index " + std::to_string (index) + " has not been opened yet" );
92+ case State::Closed:
93+ if (indexIt->second ->mFileSize )
94+ return *indexIt->second ->mFileSize ;
95+ throw std::logic_error (" ESMReader at index " + std::to_string (index) + " has forgotten its file size" );
96+ default :
97+ throw std::logic_error (" ESMReader at index " + std::to_string (index) + " in unknown state" );
98+ }
99+ }
100+
60101 void ReadersCache::closeExtraReaders ()
61102 {
62103 while (!mFreeItems .empty () && mBusyItems .size () + mFreeItems .size () + 1 > mCapacity )
@@ -65,6 +106,7 @@ namespace ESM
65106 if (it->mReader .isOpen ())
66107 {
67108 it->mName = it->mReader .getName ();
109+ it->mFileSize = it->mReader .getFileSize ();
68110 it->mReader .close ();
69111 }
70112 mClosedItems .splice (mClosedItems .end (), mFreeItems , it);
0 commit comments