DirectoryIteratorStrategy.h 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. //
  2. // RecursiveDirectoryIteratorStategies.h
  3. //
  4. // $Id$
  5. //
  6. // Library: Foundation
  7. // Package: Filesystem
  8. // Module: RecursiveDirectoryIterator
  9. //
  10. // Definitions of the RecursiveDirectoryIterator stategy classes.
  11. //
  12. // Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
  13. // and Contributors.
  14. //
  15. // SPDX-License-Identifier: BSL-1.0
  16. //
  17. #ifndef Foundation_RecursiveDirectoryIteratorStrategy_INCLUDED
  18. #define Foundation_RecursiveDirectoryIteratorStrategy_INCLUDED
  19. #include "Poco/Foundation.h"
  20. #include "Poco/DirectoryIterator.h"
  21. #include <stack>
  22. #include <queue>
  23. #include <functional>
  24. namespace Poco {
  25. class Foundation_API TraverseBase
  26. {
  27. public:
  28. typedef std::stack<DirectoryIterator> Stack;
  29. typedef std::pointer_to_unary_function<const Stack&, UInt16> DepthFunPtr;
  30. enum
  31. {
  32. D_INFINITE = 0 /// Special value for infinite traverse depth.
  33. };
  34. TraverseBase(DepthFunPtr depthDeterminer, UInt16 maxDepth = D_INFINITE);
  35. protected:
  36. bool isFiniteDepth();
  37. bool isDirectory(Poco::File& file);
  38. DepthFunPtr _depthDeterminer;
  39. UInt16 _maxDepth;
  40. DirectoryIterator _itEnd;
  41. private:
  42. TraverseBase();
  43. TraverseBase(const TraverseBase&);
  44. TraverseBase& operator=(const TraverseBase&);
  45. };
  46. class Foundation_API ChildrenFirstTraverse: public TraverseBase
  47. {
  48. public:
  49. ChildrenFirstTraverse(DepthFunPtr depthDeterminer, UInt16 maxDepth = D_INFINITE);
  50. const std::string next(Stack* itStack, bool* isFinished);
  51. private:
  52. ChildrenFirstTraverse();
  53. ChildrenFirstTraverse(const ChildrenFirstTraverse&);
  54. ChildrenFirstTraverse& operator=(const ChildrenFirstTraverse&);
  55. };
  56. class Foundation_API SiblingsFirstTraverse: public TraverseBase
  57. {
  58. public:
  59. SiblingsFirstTraverse(DepthFunPtr depthDeterminer, UInt16 maxDepth = D_INFINITE);
  60. const std::string next(Stack* itStack, bool* isFinished);
  61. private:
  62. SiblingsFirstTraverse();
  63. SiblingsFirstTraverse(const SiblingsFirstTraverse&);
  64. SiblingsFirstTraverse& operator=(const SiblingsFirstTraverse&);
  65. std::stack<std::queue<std::string> > _dirsStack;
  66. };
  67. } // namespace Poco
  68. #endif // Foundation_RecursiveDirectoryIteratorStrategy_INCLUDED