[llvm-commits] CVS: llvm/include/llvm/System/Path.h

Reid Spencer reid at x10sys.com
Sun Aug 15 01:13:12 PDT 2004



Changes in directory llvm/include/llvm/System:

Path.h added (r1.1)
---
Log message:

First version of a class to represent the notion of an operating system
path to a file or directory and some rudimentary operations on them.


---
Diffs of the changes:  (+214 -0)

Index: llvm/include/llvm/System/Path.h
diff -c /dev/null llvm/include/llvm/System/Path.h:1.1
*** /dev/null	Sun Aug 15 03:13:12 2004
--- llvm/include/llvm/System/Path.h	Sun Aug 15 03:13:01 2004
***************
*** 0 ****
--- 1,214 ----
+ //===- Path.h - Implement the Path class ------------------------*- C++ -*-===//
+ //
+ //                     The LLVM Compiler Infrastructure
+ //
+ // Copyright (C) 2003 eXtensible Systems, Inc. All Rights Reserved.
+ //
+ // This program is open source software; you can redistribute it and/or modify
+ // it under the terms of the University of Illinois Open Source License. See
+ // LICENSE.TXT (distributed with this software) for details.
+ //
+ // This program is distributed in the hope that it will be useful, but
+ // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ // or FITNESS FOR A PARTICULAR PURPOSE.  
+ //
+ //===----------------------------------------------------------------------===//
+ //
+ // This file declares the llvm::sys::Path class. The Path class provides the
+ // operating system agnostic concept of the name of a file or directory.
+ //
+ //===----------------------------------------------------------------------===//
+ /// @file lib/System/Path.h
+ /// @author Reid Spencer <raspencer at x10sys.com> (original author)
+ /// @version \verbatim $Id: Path.h,v 1.1 2004/08/15 08:13:01 reid Exp $ \endverbatim
+ /// @date 2004/08/14
+ /// @since 1.4
+ /// @brief Declares the llvm::sys::Path class.
+ //===----------------------------------------------------------------------===//
+ 
+ #ifndef LLVM_SYSTEM_PATH_H
+ #define LLVM_SYSTEM_PATH_H
+ 
+ #include "llvm/System/ErrorCode.h"
+ 
+ namespace llvm {
+ namespace sys {
+ 
+   /// This class provides an abstraction for the name of a path
+   /// to a file or directory in the filesystem.
+   /// @since 1.4
+   /// @brief An abstraction for operating system paths.
+   class Path : public std::string 
+   {
+   /// @name Types
+   /// @{
+   public:
+     /// @brief An enumerator for specifying special ways to construct
+     /// the path.
+     enum ConstructSpecial {
+       CONSTRUCT_TEMP_FILE = 1, ///< make a temporary file name
+       CONSTRUCT_TEMP_DIR = 2,  ///< Make a temporary directory name
+     };
+ 
+   /// @}
+   /// @name Constructors
+   /// @{
+   public:
+     /// Forward declare this because constructors need to use it.
+     /// @returns true if the path is valid
+     /// @brief Determines if the path is valid (properly formed) or not.
+     inline bool is_valid() const throw();
+ 
+     /// Creates a null (empty) path
+     /// @brief Default Constructor
+     Path () throw() {}
+ 
+     /// Creates a path from char*
+     /// @brief char* converter
+     Path ( const char * name ) throw() : std::string(name) {
+       assert(is_valid());
+     }
+ 
+     /// @brief std::string converter
+     Path ( const std::string& name ) throw() : std::string(name) {
+       assert(is_valid());
+     }
+ 
+     /// Copies the path with copy-on-write semantics. The \p this Path
+     /// will reference \p the that Path until one of them is modified
+     /// at which point a full copy is taken before the write.
+     /// @brief Copy Constructor
+     Path ( const Path & that ) throw() : std::string(that) {
+       assert(is_valid());
+     }
+ 
+     /// This constructor will construct the path using a special 
+     /// construction argument that will pre-fill the path with the name
+     /// of some special path name
+     /// @brief Construct a special, well known path
+     Path( ConstructSpecial ) throw();
+ 
+     /// Releases storage associated with the Path object
+     /// @brief Destructor
+     ~Path () throw() {}
+ 
+   /// @}
+   /// @name Operators
+   /// @{
+   public:
+     /// Makes a copy of \p that to \p this with copy-on-write semantics.
+     /// @returns \p this
+     /// @brief Assignment Operator
+     Path & operator = ( const Path & that ) throw() {
+       this->assign ( that );
+       return *this;
+     }
+ 
+     /// Comparies \p this Path with \p that Path for equality.
+     /// @returns true if \p this and \p that refer to the same item.
+     /// @brief Equality Operator
+     bool operator ==( const Path & that ) const throw() {
+       return 0 == this->compare( that ) ;
+     }
+ 
+     /// Comparies \p this Path with \p that Path for inequality.
+     /// @returns true if \p this and \p that refer to different items.
+     /// @brief Inequality Operator
+     bool operator !=( const Path & that ) const throw() {
+       return 0 != this->compare( that );
+     }
+ 
+   /// @}
+   /// @name Accessors
+   /// @{
+   public:
+     /// @returns true if the path could reference a file
+     /// @brief Determines if the path is valid for a file reference.
+     bool is_file() const throw();
+ 
+     /// @returns true if the path could reference a directory
+     /// @brief Determines if the path is valid for a directory reference.
+     bool is_directory() const throw();
+ 
+     /// @brief Fills and zero terminates a buffer with the path
+     inline void fill( char* buffer, uint32_t len ) const throw();
+ 
+   /// @}
+   /// @name Mutators
+   /// @{
+   public:
+     /// This ensures that the pathname is terminated with a /
+     /// @brief Make the path reference a directory.
+     ErrorCode make_directory() throw();
+ 
+     /// This ensures that the pathname is not terminated with a /
+     /// @brief Makes the path reference a file.
+     ErrorCode make_file() throw();
+ 
+     /// the file system.
+     /// @returns true if the pathname references an existing file.
+     /// @brief Determines if the path is a file or directory in
+     ErrorCode exists()  throw();
+ 
+     /// The \p dirname is added to the end of the Path.
+     /// @param dirname A string providing the directory name to
+     /// be appended to the path.
+     /// @brief Appends the name of a directory.
+     ErrorCode append_directory( const std::string & dirname ) throw();
+ 
+     /// The \p filename is added to the end of the Path.
+     /// @brief Appends the name of a file.
+     ErrorCode append_file( const std::string& filename ) throw();
+ 
+     /// Directories will have no entries. Files will be zero length. If
+     /// the file or directory already exists, no error results.
+     /// @throws SystemException if any error occurs.
+     /// @brief Causes the file or directory to exist in the filesystem.
+     ErrorCode create( bool create_parents = false ) throw();
+ 
+     ErrorCode create_directory() throw();
+     ErrorCode create_directories() throw() ;
+     ErrorCode create_file() throw() ;
+ 
+     /// Directories must be empty before they can be removed. If not,
+     /// an error will result. Files will be unlinked, even if another
+     /// process is using them.
+     /// @brief Removes the file or directory from the filesystem.
+     ErrorCode remove() throw();
+     ErrorCode remove_directory() throw() ;
+     ErrorCode remove_file() throw() ; 
+ 
+     /// Temporary file names are a common need. This method uses the
+     /// template in the existing path and uniquifies a file name based
+     /// on the template.
+     ErrorCode make_temp_file() throw();
+ 
+     /// Temporary directory names are a common need. This method uses
+     /// the template in the existing path and uniqufies a directory
+     /// name based on the template.
+     ErrorCode make_temp_directory() throw();
+ 
+     /// Find library.
+     ErrorCode find_lib( const char * file ) throw();
+   /// @}
+ 
+   };
+ 
+   inline bool Path::is_valid() const throw() {
+     if ( empty() ) return false;
+     return true;
+   }
+ 
+   inline void Path::fill( char* buffer, size_t bufflen ) const throw() {
+     size_t pathlen = length();
+     assert( bufflen > pathlen );
+     size_t copylen = pathlen <? (bufflen - 1);
+     this->copy(buffer, copylen, 0 );
+     buffer[ copylen ] = 0;
+   }
+ }
+ }
+ 
+ // vim: sw=2 smartindent smarttab tw=80 autoindent expandtab
+ 
+ #endif






More information about the llvm-commits mailing list