Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/intercoms/src/G4UIcommandTree.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /intercoms/src/G4UIcommandTree.cc (Version 11.3.0) and /intercoms/src/G4UIcommandTree.cc (Version 10.1.p3)


                                                   >>   1 //
  1 // *******************************************      2 // ********************************************************************
  2 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  3 // *                                                4 // *                                                                  *
  4 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  5 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  6 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  7 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  8 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
  9 // *                                               10 // *                                                                  *
 10 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 11 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 12 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 13 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 14 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 15 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 16 // *                                               17 // *                                                                  *
 17 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 18 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 19 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 20 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 21 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 22 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 23 // *******************************************     24 // ********************************************************************
 24 //                                                 25 //
 25 // G4UIcommandTree                             << 
 26 //                                                 26 //
 27 // Author: Makoto Asai (SLAC), 1998            <<  27 // $Id: G4UIcommandTree.cc 77651 2013-11-27 08:47:55Z gcosmo $
 28 // Midified: Makoto Asai (SLAC), 2021          <<  28 //
 29 //   Improve output HTML file layout and add o << 
 30 //   command/directory names in alphabetic ord << 
 31 // ------------------------------------------- << 
 32                                                    29 
 33 #include "G4UIcommandTree.hh"                      30 #include "G4UIcommandTree.hh"
 34                                                << 
 35 #include "G4StateManager.hh"                       31 #include "G4StateManager.hh"
 36 #include "G4UIdirectory.hh"                    <<  32 #include <fstream>
 37 #include "G4UImanager.hh"                      << 
 38 #include "G4ios.hh"                                33 #include "G4ios.hh"
 39                                                    34 
 40 #include <fstream>                             <<  35 G4UIcommandTree::G4UIcommandTree()
                                                   >>  36 :guidance(NULL),broadcastCommands(true)
                                                   >>  37 { }
 41                                                    38 
 42 // ------------------------------------------- <<  39 G4UIcommandTree::G4UIcommandTree(const char * thePathName)
 43 G4UIcommandTree::G4UIcommandTree(const char* t <<  40 :guidance(NULL),broadcastCommands(true)
 44 {                                                  41 {
 45   pathName = thePathName;                          42   pathName = thePathName;
 46 }                                                  43 }
 47                                                    44 
 48 // ------------------------------------------- << 
 49 G4UIcommandTree::~G4UIcommandTree()                45 G4UIcommandTree::~G4UIcommandTree()
 50 {                                                  46 {
 51   for (auto& i : tree) {                       <<  47   G4int i;
 52     delete i;                                  <<  48   G4int n_treeEntry = tree.size();
 53   }                                            <<  49   for( i=0; i < n_treeEntry; i++ )
                                                   >>  50   { delete tree[i]; }
 54 }                                                  51 }
 55                                                    52 
 56 // ------------------------------------------- <<  53 G4int G4UIcommandTree::operator==(const G4UIcommandTree &right) const
 57 G4bool G4UIcommandTree::operator==(const G4UIc << 
 58 {                                                  54 {
 59   return (pathName == right.GetPathName());    <<  55   return ( pathName == right.GetPathName() );
 60 }                                                  56 }
 61                                                    57 
 62 // ------------------------------------------- <<  58 G4int G4UIcommandTree::operator!=(const G4UIcommandTree &right) const
 63 G4bool G4UIcommandTree::operator!=(const G4UIc << 
 64 {                                                  59 {
 65   return (pathName != right.GetPathName());    <<  60   return ( pathName != right.GetPathName() );
 66 }                                                  61 }
 67                                                    62 
 68 // ------------------------------------------- <<  63 void G4UIcommandTree::AddNewCommand(G4UIcommand *newCommand, G4bool workerThreadOnly)
 69 void G4UIcommandTree::AddNewCommand(G4UIcomman << 
 70 {                                                  64 {
 71   G4String commandPath = newCommand->GetComman     65   G4String commandPath = newCommand->GetCommandPath();
 72   G4String remainingPath = commandPath;            66   G4String remainingPath = commandPath;
 73   remainingPath.erase(0, pathName.length());   <<  67   remainingPath.remove(0,pathName.length());
 74   if (remainingPath.empty()) {                 <<  68   if( remainingPath.isNull() )
 75     if (guidance == nullptr) {                 <<  69   {
                                                   >>  70     if(!guidance)
                                                   >>  71     {
 76       guidance = newCommand;                       72       guidance = newCommand;
 77       if (!(newCommand->ToBeBroadcasted())) {  <<  73       if(!(newCommand->ToBeBroadcasted())) broadcastCommands = false;
 78         broadcastCommands = false;             <<  74       if(workerThreadOnly) newCommand->SetWorkerThreadOnly();
 79       }                                        << 
 80       if (workerThreadOnly) {                  << 
 81         newCommand->SetWorkerThreadOnly();     << 
 82       }                                        << 
 83     }                                              75     }
 84     return;                                        76     return;
 85   }                                                77   }
 86                                                <<  78   G4int i = remainingPath.first('/');
 87   if (guidance != nullptr) {                   <<  79   if( i == G4int(std::string::npos) )
 88     auto* dir = static_cast<G4UIdirectory*>(gu <<  80   {
 89     ifSort = dir->IfSort();                    <<  81     // Find command
 90   }                                            <<  82     G4int n_commandEntry = command.size();
 91   std::size_t i = remainingPath.find('/');     <<  83     for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
 92   if (i == std::string::npos) {                <<  84     {
 93     // Adding a new command to this directory  <<  85       if( remainingPath == command[i_thCommand]->GetCommandName() )
 94     std::size_t n_commandEntry = command.size( <<  86       { return; }
 95     for (std::size_t i_thCommand = 0; i_thComm << 
 96       if (remainingPath == command[i_thCommand << 
 97         // a command of same name has already  << 
 98         if (G4UImanager::GetUIpointer()->GetVe << 
 99           G4ExceptionDescription ed;           << 
100           ed << "Command <" << commandPath <<  << 
101           G4Exception("G4UIcommandTree::AddNew << 
102                       // FatalException,       << 
103                       JustWarning, ed);        << 
104         }                                      << 
105         return;                                << 
106       }                                        << 
107     }                                          << 
108     if (!broadcastCommands) {                  << 
109       newCommand->SetToBeBroadcasted(false);   << 
110     }                                          << 
111     if (workerThreadOnly) {                    << 
112       newCommand->SetWorkerThreadOnly();       << 
113     }                                          << 
114     if (ifSort) {                              << 
115       auto j = command.cbegin();               << 
116       for (; j != command.cend(); ++j) {       << 
117         if (newCommand->GetCommandPath() < (*j << 
118           break;                               << 
119         }                                      << 
120       }                                        << 
121       command.insert(j, newCommand);           << 
122     }                                          << 
123     else {                                     << 
124       command.push_back(newCommand);           << 
125     }                                              87     }
                                                   >>  88     if(!broadcastCommands) newCommand->SetToBeBroadcasted(false);
                                                   >>  89     if(workerThreadOnly) newCommand->SetWorkerThreadOnly();
                                                   >>  90     command.push_back( newCommand );
126     return;                                        91     return;
127   }                                                92   }
128                                                <<  93   else
129   // Adding a new command to a sub-directory   <<  94   {
130   G4String nextPath = pathName;                <<  95     // Find path
131   nextPath.append(remainingPath.substr(0, i +  <<  96     G4String nextPath = pathName;
132   std::size_t n_treeEntry = tree.size();       <<  97     nextPath.append(remainingPath(0,i+1));
133   for (std::size_t i_thTree = 0; i_thTree < n_ <<  98     G4int n_treeEntry = tree.size();
134     if (nextPath == tree[i_thTree]->GetPathNam <<  99     for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
135       if (!broadcastCommands) {                << 100     {
136         newCommand->SetToBeBroadcasted(false); << 101       if( nextPath == tree[i_thTree]->GetPathName() )
137       }                                        << 102       { 
138       tree[i_thTree]->AddNewCommand(newCommand << 103         if(!broadcastCommands) newCommand->SetToBeBroadcasted(false);
139       return;                                  << 104   tree[i_thTree]->AddNewCommand( newCommand, workerThreadOnly );
140     }                                          << 105   return; 
141   }                                            << 
142   // Creating a new sub-directory              << 
143   auto* newTree = new G4UIcommandTree(nextPath << 
144   if (ifSort) {                                << 
145     auto j = tree.cbegin();                    << 
146     for (; j != tree.cend(); ++j) {            << 
147       if (newTree->GetPathName() < (*j)->GetPa << 
148         break;                                 << 
149       }                                           106       }
150     }                                             107     }
151     tree.insert(j, newTree);                   << 108     G4UIcommandTree * newTree = new G4UIcommandTree( nextPath );
152   }                                            << 109     tree.push_back( newTree );
153   else {                                       << 110     if(!broadcastCommands) newCommand->SetToBeBroadcasted(false);
154     tree.push_back(newTree);                   << 111     newTree->AddNewCommand( newCommand, workerThreadOnly );
155   }                                            << 112     return;
156   if (!broadcastCommands) {                    << 
157     newCommand->SetToBeBroadcasted(false);     << 
158   }                                               113   }
159   // In case a new sub-directry is created wit << 
160   // (most-likely this is the case), inherit t << 
161   newCommand->SetDefaultSortFlag(ifSort);      << 
162   newTree->AddNewCommand(newCommand, workerThr << 
163   return;                                      << 
164 }                                                 114 }
165                                                   115 
166 // ------------------------------------------- << 116 void G4UIcommandTree::RemoveCommand(G4UIcommand *aCommand, G4bool workerThreadOnly)
167 void G4UIcommandTree::RemoveCommand(G4UIcomman << 
168 {                                                 117 {
169   if (workerThreadOnly && !(aCommand->IsWorker << 118   if(workerThreadOnly && !(aCommand->IsWorkerThreadOnly())) return;
170     return;                                    << 
171   }                                            << 
172   G4String commandPath = aCommand->GetCommandP    119   G4String commandPath = aCommand->GetCommandPath();
173   commandPath.erase(0, pathName.length());     << 120   G4String remainingPath = commandPath;
174   if (commandPath.empty()) {                   << 121   remainingPath.remove(0,pathName.length());
175     guidance = nullptr;                        << 122   if( remainingPath.isNull() )
176   }                                            << 123   {
177   else {                                       << 124     guidance = NULL;
178     std::size_t i = commandPath.find('/');     << 125   }
179     if (i == std::string::npos) {              << 126   else
                                                   >> 127   {
                                                   >> 128     G4int i = remainingPath.first('/');
                                                   >> 129     if( i == G4int(std::string::npos) )
                                                   >> 130     {
180       // Find command                             131       // Find command
181       std::size_t n_commandEntry = command.siz << 132       G4int n_commandEntry = command.size();
182       for (std::size_t i_thCommand = 0; i_thCo << 133       for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
183         if (commandPath == command[i_thCommand << 134       {
184           command.erase(command.begin() + i_th << 135         if( remainingPath == command[i_thCommand]->GetCommandName() )
                                                   >> 136         { 
                                                   >> 137           command.erase(command.begin()+i_thCommand);
185           break;                                  138           break;
186         }                                         139         }
187       }                                           140       }
188     }                                             141     }
189     else {                                     << 142     else
                                                   >> 143     {
190       // Find path                                144       // Find path
191       G4String nextPath = pathName;               145       G4String nextPath = pathName;
192       nextPath.append(commandPath.substr(0, i  << 146       nextPath.append(remainingPath(0,i+1));
193       std::size_t n_treeEntry = tree.size();   << 147       G4int n_treeEntry = tree.size();
194       for (std::size_t i_thTree = 0; i_thTree  << 148       for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
195         if (nextPath == tree[i_thTree]->GetPat << 149       {
196           tree[i_thTree]->RemoveCommand(aComma << 150         if( nextPath == tree[i_thTree]->GetPathName() )
197           G4int n_commandRemain = tree[i_thTre << 151         { 
198           G4int n_treeRemain = tree[i_thTree]- << 152         tree[i_thTree]->RemoveCommand( aCommand );
199           if (n_commandRemain == 0 && n_treeRe << 153         G4int n_commandRemain = tree[i_thTree]->GetCommandEntry();
200             G4UIcommandTree* emptyTree = tree[ << 154         G4int n_treeRemain = tree[i_thTree]-> GetTreeEntry();
201             tree.erase(tree.begin() + i_thTree << 155         if(n_commandRemain == 0 && n_treeRemain == 0)
202             delete emptyTree;                  << 156         {
203           }                                    << 157           G4UIcommandTree * emptyTree = tree[i_thTree];
204           break;                               << 158           tree.erase(tree.begin()+i_thTree);
                                                   >> 159           delete emptyTree;
                                                   >> 160         }
                                                   >> 161         break;
205         }                                         162         }
206       }                                           163       }
207     }                                             164     }
208   }                                               165   }
209 }                                                 166 }
210                                                   167 
211 // ------------------------------------------- << 168 // L. Garnier 01.28.08 This function has not a good name. In fact, it try
212 G4UIcommand* G4UIcommandTree::FindPath(const c << 169 // to match a command name, not a path. It should be rename as FindCommandName
213 {                                              << 
214   // This function tries to match a command na << 
215                                                   170 
                                                   >> 171 G4UIcommand * G4UIcommandTree::FindPath(const char* commandPath) const
                                                   >> 172 {
216   G4String remainingPath = commandPath;           173   G4String remainingPath = commandPath;
217   if (remainingPath.find(pathName) == std::str << 174   if( remainingPath.index( pathName ) == std::string::npos )
218     return nullptr;                            << 175   { return NULL; }
219   }                                            << 176   remainingPath.remove(0,pathName.length());
220   remainingPath.erase(0, pathName.length());   << 177   G4int i = remainingPath.first('/');
221   std::size_t i = remainingPath.find('/');     << 178   if( i == G4int(std::string::npos) )
222   if (i == std::string::npos) {                << 179   {
223     // Find command                               180     // Find command
224     std::size_t n_commandEntry = command.size( << 181     G4int n_commandEntry = command.size();
225     for (std::size_t i_thCommand = 0; i_thComm << 182     for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
226       if (remainingPath == command[i_thCommand << 183     {
227         return command[i_thCommand];           << 184       if( remainingPath == command[i_thCommand]->GetCommandName() )
228       }                                        << 185       { return command[i_thCommand]; }
229     }                                             186     }
230   }                                               187   }
231   else {                                       << 188   else
                                                   >> 189   {
232     // Find path                                  190     // Find path
233     G4String nextPath = pathName;                 191     G4String nextPath = pathName;
234     nextPath.append(remainingPath.substr(0, i  << 192     nextPath.append(remainingPath(0,i+1));
235     std::size_t n_treeEntry = tree.size();     << 193     G4int n_treeEntry = tree.size();
236     for (std::size_t i_thTree = 0; i_thTree <  << 194     for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
237       if (nextPath == tree[i_thTree]->GetPathN << 195     {
238         return tree[i_thTree]->FindPath(comman << 196       if( nextPath == tree[i_thTree]->GetPathName() )
239       }                                        << 197       { return tree[i_thTree]->FindPath( commandPath ); }
240     }                                             198     }
241   }                                               199   }
242   return nullptr;                              << 200   return NULL;
243 }                                                 201 }
244                                                   202 
245 // ------------------------------------------- << 203 
                                                   >> 204 /**
                                                   >> 205  * Try to match a command or a path with the one given.
                                                   >> 206  * @commandPath : command or path to match
                                                   >> 207  * @return the commandTree found or NULL if not
                                                   >> 208  */
246 G4UIcommandTree* G4UIcommandTree::FindCommandT    209 G4UIcommandTree* G4UIcommandTree::FindCommandTree(const char* commandPath)
247 {                                                 210 {
248   // Try to match a command or a path with the << 
249   // @commandPath : command or path to match   << 
250   // @return the commandTree found or nullptr  << 
251                                                << 
252   G4String remainingPath = commandPath;           211   G4String remainingPath = commandPath;
253   if (remainingPath.find(pathName) == std::str << 212   if( remainingPath.index( pathName ) == std::string::npos )
254     return nullptr;                            << 213   { return NULL; }
255   }                                            << 214   remainingPath.remove(0,pathName.length());
256   remainingPath.erase(0, pathName.length());   << 215   G4int i = remainingPath.first('/');
257   std::size_t i = remainingPath.find('/');     << 216   if( i != G4int(std::string::npos) )
258   if (i != std::string::npos) {                << 217   {
259     // Find path                                  218     // Find path
260     G4String nextPath = pathName;                 219     G4String nextPath = pathName;
261     nextPath.append(remainingPath.substr(0, i  << 220     nextPath.append(remainingPath(0,i+1));
262     std::size_t n_treeEntry = tree.size();     << 221     G4int n_treeEntry = tree.size();
263     for (std::size_t i_thTree = 0; i_thTree <  << 222     for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
                                                   >> 223     {
264       if (tree[i_thTree]->GetPathName() == com    224       if (tree[i_thTree]->GetPathName() == commandPath) {
265         return tree[i_thTree];                    225         return tree[i_thTree];
266       }                                           226       }
267       if (nextPath == tree[i_thTree]->GetPathN << 227       else if( nextPath == tree[i_thTree]->GetPathName() ) {
268         return tree[i_thTree]->FindCommandTree << 228         return tree[i_thTree]->FindCommandTree( commandPath );
269       }                                           229       }
270     }                                             230     }
271   }                                            << 231   } else {
272   else {                                       << 
273     return this;                                  232     return this;
274   }                                               233   }
275   return nullptr;                              << 234   return NULL;
276 }                                                 235 }
277                                                   236 
278 // ------------------------------------------- << 
279 G4String G4UIcommandTree::CompleteCommandPath(    237 G4String G4UIcommandTree::CompleteCommandPath(const G4String& aCommandPath)
280 {                                                 238 {
281   G4String pName = aCommandPath;                  239   G4String pName = aCommandPath;
282   G4String remainingPath = aCommandPath;          240   G4String remainingPath = aCommandPath;
283   G4String empty = "";                            241   G4String empty = "";
284   G4String matchingPath = empty;                  242   G4String matchingPath = empty;
285                                                   243 
286   // find the tree                                244   // find the tree
287   auto jpre = pName.rfind('/');                << 245   G4int jpre= pName.last('/');
288   if (jpre != G4String::npos) {                << 246   if(jpre != G4int(G4String::npos)) pName.remove(jpre+1);
289     pName.erase(jpre + 1);                     << 
290   }                                            << 
291   G4UIcommandTree* aTree = FindCommandTree(pNa    247   G4UIcommandTree* aTree = FindCommandTree(pName);
292                                                   248 
293   if (aTree == nullptr) {                      << 249   if (!aTree) {
294     return empty;                              << 
295   }                                            << 
296                                                << 
297   if (pName.find(pName) == std::string::npos)  << 
298     return empty;                                 250     return empty;
299   }                                               251   }
                                                   >> 252   
                                                   >> 253   if( pName.index( pName ) == std::string::npos ) return empty;
300                                                   254 
301   std::vector<G4String> paths;                    255   std::vector<G4String> paths;
302                                                   256 
303   // list matched directories/commands            257   // list matched directories/commands
304   G4String strtmp;                                258   G4String strtmp;
305   G4int nMatch = 0;                            << 259   G4int nMatch= 0;
306                                                << 
307   G4int Ndir = aTree->GetTreeEntry();          << 
308   G4int Ncmd = aTree->GetCommandEntry();       << 
309                                                   260 
                                                   >> 261   int Ndir= aTree-> GetTreeEntry();
                                                   >> 262   int Ncmd= aTree-> GetCommandEntry();
                                                   >> 263   
310   // directory ...                                264   // directory ...
311   for (G4int idir = 1; idir <= Ndir; ++idir) { << 265   for(G4int idir=1; idir<=Ndir; idir++) {
312     const G4String& fpdir = aTree->GetTree(idi << 266     G4String fpdir= aTree-> GetTree(idir)-> GetPathName();
313     // matching test                              267     // matching test
314     if (fpdir.find(remainingPath, 0) == 0) {   << 268     if( fpdir.index(remainingPath, 0) == 0) {
315       if (nMatch == 0) {                       << 269       if(nMatch==0) {
316         matchingPath = fpdir;                     270         matchingPath = fpdir;
                                                   >> 271       } else {
                                                   >> 272         matchingPath = GetFirstMatchedString(fpdir,matchingPath);
317       }                                           273       }
318       else {                                   << 274       nMatch++;
319         matchingPath = GetFirstMatchedString(f << 
320       }                                        << 
321       ++nMatch;                                << 
322       paths.push_back(fpdir);                     275       paths.push_back(fpdir);
323     }                                             276     }
324   }                                               277   }
325                                                << 278   
326   if (paths.size() >= 2) {                     << 279   if (paths.size()>=2) {
327     G4cout << "Matching directories :" << G4en << 280     G4cout << "Matching directories :" << G4endl; 
328     for (const auto& path : paths) {           << 281     for( unsigned int i_thCommand = 0; i_thCommand < paths.size(); i_thCommand++ ) {
329       G4cout << path << G4endl;                << 282       G4cout << paths[i_thCommand] << G4endl; 
330     }                                             283     }
331   }                                               284   }
332                                                << 285   
333   // command ...                                  286   // command ...
334   std::vector<G4String> commands;                 287   std::vector<G4String> commands;
335                                                   288 
336   for (G4int icmd = 1; icmd <= Ncmd; ++icmd) { << 289   for(G4int icmd=1; icmd<=Ncmd; icmd++){
337     G4String fpcmd = aTree->GetPathName() + aT << 290     G4String fpcmd= aTree-> GetPathName() +
                                                   >> 291                     aTree-> GetCommand(icmd) -> GetCommandName();
338     // matching test                              292     // matching test
339     if (fpcmd.find(remainingPath, 0) == 0) {   << 293     if( fpcmd.index(remainingPath, 0) ==0) {
340       if (nMatch == 0) {                       << 294       if(nMatch==0) {
341         matchingPath = fpcmd + " ";            << 295         matchingPath= fpcmd + " ";
342       }                                        << 296       } else {
343       else {                                   << 297         strtmp= fpcmd + " ";
344         strtmp = fpcmd + " ";                  << 298         matchingPath= GetFirstMatchedString(matchingPath, strtmp);
345         matchingPath = GetFirstMatchedString(m << 
346       }                                           299       }
347       nMatch++;                                   300       nMatch++;
348       commands.emplace_back(fpcmd + " ");      << 301       commands.push_back(fpcmd+" ");
349     }                                             302     }
350   }                                               303   }
351                                                   304 
352   if (commands.size() >= 2) {                  << 305   if (commands.size()>=2) {
353     G4cout << "Matching commands :" << G4endl; << 306     G4cout << "Matching commands :" << G4endl; 
354     for (const auto& matched : commands) {     << 307     for( unsigned int i_thCommand = 0; i_thCommand < commands.size(); i_thCommand++ ) {
355       G4cout << matched << G4endl;             << 308       G4cout << commands[i_thCommand] << G4endl; 
356     }                                             309     }
357   }                                               310   }
358                                                   311 
359   return matchingPath;                            312   return matchingPath;
360 }                                                 313 }
361                                                   314 
362 // ------------------------------------------- << 315 
363 G4String G4UIcommandTree::GetFirstMatchedStrin << 316 ////////////////////////////////////////////////////////////////////
                                                   >> 317 G4String G4UIcommandTree::GetFirstMatchedString(const G4String& str1, 
                                                   >> 318            const G4String& str2) const
                                                   >> 319 ////////////////////////////////////////////////////////////////////
364 {                                                 320 {
365   std::size_t nlen1 = str1.length();           << 321   int nlen1= str1.length();
366   std::size_t nlen2 = str2.length();           << 322   int nlen2= str2.length();
367                                                   323 
368   std::size_t nmin = nlen1 < nlen2 ? nlen1 : n << 324   int nmin = nlen1<nlen2 ? nlen1 : nlen2;
369                                                   325 
370   G4String strMatched;                            326   G4String strMatched;
371   for (G4int i = 0; i < (G4int)nmin; ++i) {    << 327   for(size_t i=0; G4int(i)<nmin; i++){
372     if (str1[i] == str2[i]) {                  << 328     if(str1[i]==str2[i]) {
373       strMatched += str1[i];                   << 329       strMatched+= str1[i];
374     }                                          << 330     } else {
375     else {                                     << 
376       break;                                      331       break;
377     }                                             332     }
378   }                                               333   }
379                                                   334 
380   return strMatched;                              335   return strMatched;
381 }                                                 336 }
382                                                   337 
383 // ------------------------------------------- << 
384 void G4UIcommandTree::ListCurrent() const         338 void G4UIcommandTree::ListCurrent() const
385 {                                                 339 {
386   G4cout << "Command directory path : " << pat    340   G4cout << "Command directory path : " << pathName << G4endl;
387   if (guidance != nullptr) {                   << 341   if( guidance != NULL ) guidance->List();
388     guidance->List();                          << 
389   }                                            << 
390   G4cout << " Sub-directories : " << G4endl;      342   G4cout << " Sub-directories : " << G4endl;
391   std::size_t n_treeEntry = tree.size();       << 343   G4int n_treeEntry = tree.size();
392   for (std::size_t i_thTree = 0; i_thTree < n_ << 344   for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
                                                   >> 345   { 
393     G4cout << "   " << tree[i_thTree]->GetPath    346     G4cout << "   " << tree[i_thTree]->GetPathName();
394     if ((tree[i_thTree]->GetGuidance() != null << 347     if(tree[i_thTree]->GetGuidance() &&
395         && tree[i_thTree]->GetGuidance()->IsWo << 348        tree[i_thTree]->GetGuidance()->IsWorkerThreadOnly())
396     {                                          << 349     { G4cout << " @ "; }
397       G4cout << " @ ";                         << 350     else
398     }                                          << 351     { G4cout << "   "; }
399     else {                                     << 
400       G4cout << "   ";                         << 
401     }                                          << 
402     G4cout << tree[i_thTree]->GetTitle() << G4    352     G4cout << tree[i_thTree]->GetTitle() << G4endl;
403   }                                               353   }
404   G4cout << " Commands : " << G4endl;             354   G4cout << " Commands : " << G4endl;
405   std::size_t n_commandEntry = command.size(); << 355   G4int n_commandEntry = command.size();
406   for (std::size_t i_thCommand = 0; i_thComman << 356   for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
                                                   >> 357   {
407     G4cout << "   " << command[i_thCommand]->G    358     G4cout << "   " << command[i_thCommand]->GetCommandName();
408     if (command[i_thCommand]->IsWorkerThreadOn << 359     if(command[i_thCommand]->IsWorkerThreadOnly())
409       G4cout << " @ ";                         << 360     { G4cout << " @ "; }
410     }                                          << 361     else
411     else {                                     << 362     { G4cout << " * "; }
412       G4cout << " * ";                         << 
413     }                                          << 
414     G4cout << command[i_thCommand]->GetTitle()    363     G4cout << command[i_thCommand]->GetTitle() << G4endl;
415   }                                               364   }
416 }                                                 365 }
417                                                   366 
418 // ------------------------------------------- << 
419 void G4UIcommandTree::ListCurrentWithNum() con    367 void G4UIcommandTree::ListCurrentWithNum() const
420 {                                                 368 {
421   G4cout << "Command directory path : " << pat    369   G4cout << "Command directory path : " << pathName << G4endl;
422   if (guidance != nullptr) {                   << 370   if( guidance != NULL ) guidance->List();
423     guidance->List();                          << 
424   }                                            << 
425   G4int i = 0;                                    371   G4int i = 0;
426   G4cout << " Sub-directories : " << G4endl;      372   G4cout << " Sub-directories : " << G4endl;
427   std::size_t n_treeEntry = tree.size();       << 373   G4int n_treeEntry = tree.size();
428   for (std::size_t i_thTree = 0; i_thTree < n_ << 374   for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
429     ++i;                                       << 375   {
430     G4cout << " " << i << ") " << tree[i_thTre << 376     i++;
431            << tree[i_thTree]->GetTitle() << G4 << 377     G4cout << " " << i << ") " << tree[i_thTree]->GetPathName() 
                                                   >> 378    << "   " << tree[i_thTree]->GetTitle() << G4endl;
432   }                                               379   }
433   G4cout << " Commands : " << G4endl;             380   G4cout << " Commands : " << G4endl;
434   std::size_t n_commandEntry = command.size(); << 381   G4int n_commandEntry = command.size();
435   for (std::size_t i_thCommand = 0; i_thComman << 382   for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
436     ++i;                                       << 383   {
437     G4cout << " " << i << ") " << command[i_th << 384     i++;
438            << command[i_thCommand]->GetTitle() << 385     G4cout << " " << i << ") " << command[i_thCommand]->GetCommandName() 
                                                   >> 386    << " * " << command[i_thCommand]->GetTitle() << G4endl;
439   }                                               387   }
440 }                                                 388 }
441                                                   389 
442 // ------------------------------------------- << 
443 void G4UIcommandTree::List() const                390 void G4UIcommandTree::List() const
444 {                                                 391 {
445   ListCurrent();                                  392   ListCurrent();
446   std::size_t n_commandEntry = command.size(); << 393   G4int n_commandEntry = command.size();
447   for (std::size_t i_thCommand = 0; i_thComman << 394   for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
                                                   >> 395   {
448     command[i_thCommand]->List();                 396     command[i_thCommand]->List();
449   }                                               397   }
450   std::size_t n_treeEntry = tree.size();       << 398   G4int n_treeEntry = tree.size();
451   for (std::size_t i_thTree = 0; i_thTree < n_ << 399   for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
                                                   >> 400   {
452     tree[i_thTree]->List();                       401     tree[i_thTree]->List();
453   }                                               402   }
454 }                                                 403 }
455                                                   404 
456 // ------------------------------------------- << 
457 G4String G4UIcommandTree::CreateFileName(const    405 G4String G4UIcommandTree::CreateFileName(const char* pName)
458 {                                                 406 {
459   G4String fn = pName;                            407   G4String fn = pName;
460   std::size_t idxs;                            << 408   G4int idxs;
461   while ((idxs = fn.find('/')) != std::string: << 409   while((idxs=fn.index("/"))!=G4int(std::string::npos))
462     fn[(G4int)idxs] = '_';                     << 410   { fn(idxs) = '_'; }
463   }                                            << 
464   fn += ".html";                                  411   fn += ".html";
465   return fn;                                      412   return fn;
466 }                                                 413 }
467                                                   414 
468 // ------------------------------------------- << 
469 G4String G4UIcommandTree::ModStr(const char* s    415 G4String G4UIcommandTree::ModStr(const char* strS)
470 {                                                 416 {
471   G4String sx;                                    417   G4String sx;
472   G4String str = strS;                            418   G4String str = strS;
473   for (G4int i = 0; i < G4int(str.length()); + << 419   for(G4int i=0;i<G4int(str.length());i++)
474     char c = str[i];                           << 420   {
475     switch (c) {                               << 421     char c = str(i);
476       case '<':                                << 422     switch(c)
477         sx += "&lt;";                          << 423     {
478         break;                                 << 424     case '<':
479       case '>':                                << 425       sx += "&lt;"; break;
480         sx += "&gt;";                          << 426     case '>':
481         break;                                 << 427       sx += "&gt;"; break;
482       case '&':                                << 428     case '&':
483         sx += "&amp;";                         << 429       sx += "&amp;"; break;
484         break;                                 << 430     default:
485       default:                                 << 431       sx += c;
486         sx += c;                               << 
487     }                                             432     }
488   }                                               433   }
489   return sx;                                      434   return sx;
490 }                                                 435 }
491                                                   436 
492 // ------------------------------------------- << 437 void G4UIcommandTree::CreateHTML()
493 void G4UIcommandTree::CreateHTML(const G4Strin << 
494 {                                                 438 {
495   G4String ofileName = CreateFileName(pathName    439   G4String ofileName = CreateFileName(pathName);
496   std::ofstream oF(ofileName, std::ios::out);     440   std::ofstream oF(ofileName, std::ios::out);
497                                                   441 
498   oF << "<html><head><title>Commands in " << M    442   oF << "<html><head><title>Commands in " << ModStr(pathName) << "</title></head>" << G4endl;
499   oF << "<style> \                             << 443   oF << "<body bgcolor=\"#ffffff\"><h2>" << ModStr(pathName) << "</h2><p>" << G4endl;
500     table,table td,table th { \                << 444 
501        border:1px solid #eee \                 << 445   if( guidance != NULL ) 
502     } \                                        << 446   {
503     table td,table th { \                      << 447     for(G4int i=0;i<guidance->GetGuidanceEntries();i++)
504       padding:5px 20px; \                      << 448     { oF << ModStr(guidance->GetGuidanceLine(i)) << "<br>" << G4endl; }
505       line-height:1.3; \                       << 449   }
506       text-align:inherit \                     << 450 
507     } \                                        << 451   oF << "<p><hr><p>" << G4endl;
508     a { \                                      << 452   
509       color:#17a81a; \                         << 453   oF << "<h2>Sub-directories : </h2><dl>" << G4endl;
510       text-decoration:none; \                  << 454   for( G4int i_thTree = 0; i_thTree < G4int(tree.size()); i_thTree++ )
511       transition-duration:0.3s \               << 455   {
512     } \                                        << 456     oF << "<p><br><p><dt><a href=\"" << CreateFileName(tree[i_thTree]->GetPathName())
513       a:hover { \                              << 457        << "\">" << ModStr(tree[i_thTree]->GetPathName()) << "</a>" << G4endl;
514       color:#17a81a \                          << 458     oF << "<p><dd>" << ModStr(tree[i_thTree]->GetTitle()) << G4endl;
515     } \                                        << 459     tree[i_thTree]->CreateHTML();
516     table { \                                  << 460   }
517       border-collapse:collapse; \              << 461 
518       border-spacing:0; \                      << 462   oF << "</dl><p><hr><p>" << G4endl;
519       margin-bottom:5px; \                     << 463   
520     } \                                        << 464   oF << "<h2>Commands : </h2><dl>" << G4endl;
521     h1 { \                                     << 465   for( G4int i_thCommand = 0; i_thCommand < G4int(command.size()); i_thCommand++ )
522       font-size:2.25em; \                      << 466   {
523       font-weight:300; \                       << 467     G4UIcommand* cmd = command[i_thCommand];
524       letter-spacing:-1px; \                   << 468     oF << "<p><br><p><dt><b>" << ModStr(cmd->GetCommandName());
525       line-height:1.15em; \                    << 469     if(cmd->GetParameterEntries()>0)
526       margin-bottom:0.5em; \                   << 470     {
527       word-wrap:break-word \                   << 471       for(G4int i_thParam=0;i_thParam<cmd->GetParameterEntries();i_thParam++)
528     } \                                        << 472       { oF << " [<i>" << ModStr(cmd->GetParameter(i_thParam)->GetParameterName()) << "</i>]"; }
529     h2 { \                                     << 473     }
530       font-size:1.5em; \                       << 474     oF << "</b>" << G4endl;
531       font-weight:300; \                       << 475     oF << "<p><dd>" << G4endl;
532       letter-spacing:-1px; \                   << 476     for(G4int i=0;i<cmd->GetGuidanceEntries();i++)
533       line-height:1.15em; \                    << 477     { oF << ModStr(cmd->GetGuidanceLine(i)) << "<br>" << G4endl; }
534       margin-bottom:0.5em; \                   << 478     if(!(cmd->GetRange()).isNull())
535       word-wrap:break-word \                   << 479     { oF << "<p><dd>Range : " << ModStr(cmd->GetRange()) << G4endl; }
536     } \                                        << 480     std::vector<G4ApplicationState>* availabelStateList = cmd->GetStateList();
537     h3 { \                                     << 481     if(availabelStateList->size()==6)
538       color:#26282a; \                         << 482     { oF << "<p><dd>Available at all Geant4 states." << G4endl; }
539       font-weight:300; \                       << 483     else
540       font-size:1.3em; \                       << 484     {
541       padding:15px 0 15px 0; \                 << 485       oF << "<p><dd>Available Geant4 state(s) : ";
542       border-bottom:2px #eee solid; \          << 486       for(G4int ias=0;ias<G4int(availabelStateList->size());ias++)
543       word-wrap:break-word \                   << 487       { oF << G4StateManager::GetStateManager()->GetStateString((*availabelStateList)[ias]) << " " << G4endl; }
544     } \                                        << 488     }
545     .sidebar { \                               << 489     if(cmd->GetParameterEntries()>0)
546       display:block; \                         << 490     {
547       position:relative; \                     << 491       oF << "<p><dd>Parameters<table border=1>" << G4endl;
548       position:sticky; \                       << 492       for(G4int i_thParam=0;i_thParam<cmd->GetParameterEntries();i_thParam++)
549       float:left; \                            << 493       {
550       -webkit-box-sizing:border-box; \         << 494         G4UIparameter* prm = cmd->GetParameter(i_thParam);
551       -moz-box-sizing:border-box; \            << 495         oF << "<tr><td>" << ModStr(prm->GetParameterName()) << G4endl;
552       -ms-box-sizing:border-box; \             << 496         oF << "<td>type " << prm->GetParameterType() << G4endl;
553       box-sizing:border-box; \                 << 497         oF << "<td>";
554       width:20%; \                             << 498         if(prm->IsOmittable())
555       padding-right:20px \                     << 499         { 
556     } \                                        << 500           oF << "Omittable : ";
557     .context { \                               << 501           if(prm->GetCurrentAsDefault())
558     width:80%; \                               << 502           { oF << "current value is used as the default value." << G4endl; }
559     display:inline-block; \                    << 503           else
560     background-color:#fff; \                   << 504           { oF << "default value = " << prm->GetDefaultValue() << G4endl; }
561     padding: 25px 35px 20px 30px; \            << 
562     -webkit-box-sizing:border-box; \           << 
563     -moz-box-sizing:border-box; \              << 
564     -ms-box-sizing:border-box; \               << 
565     box-sizing:border-box \                    << 
566   } \                                          << 
567     </style>"                                  << 
568      << G4endl;                                << 
569   oF << "<body bgcolor=\"#ffffff\">" << G4endl << 
570                                                << 
571   // Left Panel                                << 
572   if (createHTMLTreeLevel == 0) {              << 
573     oF << "<div class=\"sidebar\">" << sideBar << 
574   }                                            << 
575   // Right Panel                               << 
576   oF << "<div class=\"context\">";             << 
577   oF << "<h1>" << ModStr(pathName) << "</h1>"  << 
578                                                << 
579   if (guidance != nullptr) {                   << 
580     for (G4int i = 0; i < (G4int)guidance->Get << 
581       oF << ModStr(guidance->GetGuidanceLine(i << 
582     }                                          << 
583   }                                            << 
584   if (!tree.empty()) {                         << 
585     G4String menu = "";                        << 
586     G4String newSideBar = "";                  << 
587     menu += "<h2>Sub-directories </h2><table>" << 
588     newSideBar += "<h2><a href=\"" + ofileName << 
589     // Build menu short version                << 
590     for (auto& i_thTree : tree) {              << 
591       newSideBar += "<tr><td><a href=\"" + Cre << 
592                     + ModStr(i_thTree->GetPath << 
593     }                                          << 
594     // Build menu                              << 
595     for (auto& i_thTree : tree) {              << 
596       menu += "<tr><td><a href=\"" + CreateFil << 
597               + ModStr(i_thTree->GetPathName() << 
598       menu += "</td><td>" + ModStr(i_thTree->G << 
599     }                                          << 
600     menu += "</table>";                        << 
601     newSideBar += "</table>";                  << 
602     for (auto& i_thTree : tree) {              << 
603       createHTMLTreeLevel++;                   << 
604       i_thTree->CreateHTML(newSideBar);        << 
605       createHTMLTreeLevel--;                   << 
606     }                                          << 
607     oF << menu << G4endl;                      << 
608   }                                            << 
609                                                << 
610   if (!command.empty()) {                      << 
611     oF << "<h2>Commands </h2>" << G4endl;      << 
612                                                << 
613     // resume                                  << 
614     oF << "<table>" << G4endl;                 << 
615     for (std::size_t i_thCommand = 0; i_thComm << 
616       G4UIcommand* cmd = command[i_thCommand]; << 
617       oF << "<tr><td><a href=\"#c" << i_thComm << 
618       oF << "</a></td></tr>" << G4endl;        << 
619     }                                          << 
620     oF << "</table>" << G4endl;                << 
621     for (std::size_t i_thCommand = 0; i_thComm << 
622       G4UIcommand* cmd = command[i_thCommand]; << 
623       oF << "<h3 id=\"c" << i_thCommand << "\" << 
624       if (cmd->GetParameterEntries() > 0) {    << 
625         for (G4int i_thParam = 0; i_thParam <  << 
626           oF << " [<i>" << ModStr(cmd->GetPara << 
627         }                                      << 
628       }                                        << 
629       oF << "</h3>" << G4endl;                 << 
630       oF << "<p>" << G4endl;                   << 
631       for (G4int i = 0; i < (G4int)cmd->GetGui << 
632         oF << ModStr(cmd->GetGuidanceLine(i))  << 
633       }                                        << 
634       if (!(cmd->GetRange()).empty()) {        << 
635         oF << "<p>Range : " << ModStr(cmd->Get << 
636       }                                        << 
637       std::vector<G4ApplicationState>* availab << 
638       if (availabelStateList->size() == 6) {   << 
639         oF << "<p>Available at all Geant4 stat << 
640       }                                        << 
641       else {                                   << 
642         oF << "<p>Available Geant4 state(s) :  << 
643         for (auto& ias : *availabelStateList)  << 
644           oF << G4StateManager::GetStateManage << 
645         }                                      << 
646       }                                        << 
647       if (cmd->GetParameterEntries() > 0) {    << 
648         oF << "<p>Parameters<table border=1>"  << 
649         for (G4int i_thParam = 0; i_thParam <  << 
650           G4UIparameter* prm = cmd->GetParamet << 
651           oF << "<tr><td>" << ModStr(prm->GetP << 
652           oF << "<td>type " << prm->GetParamet << 
653           oF << "<td>";                        << 
654           if (prm->IsOmittable()) {            << 
655             oF << "Omittable : ";              << 
656             if (prm->GetCurrentAsDefault()) {  << 
657               oF << "current value is used as  << 
658             }                                  << 
659             else {                             << 
660               oF << "default value = " << prm- << 
661             }                                  << 
662           }                                    << 
663           oF << "<td>";                        << 
664           if (!(prm->GetParameterRange()).empt << 
665             oF << "Parameter range : " << ModS << 
666           }                                    << 
667           else if (!(prm->GetParameterCandidat << 
668             oF << "Parameter candidates : " << << 
669           }                                    << 
670         }                                         505         }
671         oF << "</table>" << G4endl;            << 506         oF << "<td>";
                                                   >> 507         if(!(prm->GetParameterRange()).isNull())
                                                   >> 508         { oF << "Parameter range : " << ModStr(prm->GetParameterRange()) << G4endl; }
                                                   >> 509         else if(!(prm->GetParameterCandidates()).isNull())
                                                   >> 510         { oF << "Parameter candidates : " << ModStr(prm->GetParameterCandidates()) << G4endl; }
672       }                                           511       }
                                                   >> 512       oF << "</table>" << G4endl;
673     }                                             513     }
                                                   >> 514 
674   }                                               515   }
675   oF << "</div></body></html>" << G4endl;      << 516   
                                                   >> 517   oF << "</dl></body></html>" << G4endl;
676   oF.close();                                     518   oF.close();
677 }                                                 519 }
678                                                   520 
679 // ------------------------------------------- << 
680 G4UIcommandTree* G4UIcommandTree::GetTree(cons << 
681 {                                              << 
682   G4String comName = comNameC;                 << 
683   for (auto& i : tree) {                       << 
684     if (comName == i->GetPathName()) {         << 
685       return i;                                << 
686     }                                          << 
687   }                                            << 
688   return nullptr;                              << 
689 }                                              << 
690                                                   521