1a2,14
> * Copyright (c) 2015 ARM Limited
> * All rights reserved
> *
> * The license below extends only to copyright in the software and shall
> * not be construed as granting a license to any other intellectual
> * property including but not limited to intellectual property relating
> * to a hardware implementation of the functionality of the software
> * licensed hereunder. You may use the software subject to the license
> * terms below provided that you ensure that this notice is replicated
> * unmodified and in its entirety in all distributions of the software,
> * modified or unmodified, in source code or in binary form.
> *
> * Copyright (c) 2013 Andreas Sandberg
29a43,44
> * Andreas Sandberg
> * Sascha Bischoff
38a54,137
> #include "base/compiler.hh"
>
> class OutputDirectory;
>
> class OutputStream
> {
> public:
> virtual ~OutputStream();
>
> /** Get the output underlying output stream */
> std::ostream *stream() const { return _stream; };
>
> /**
> * Can the file be recreated if the output directory is moved?
> *
> * @return true if the file will be created in the new location,
> * false otherwise.
> */
> virtual bool recreateable() const { return false; }
>
> /** Get the file name in the output directory */
> const std::string &name() const { return _name; }
>
> protected:
> friend class OutputDirectory;
>
> /** Wrap an existing stream */
> OutputStream(const std::string &name,
> std::ostream *stream);
>
> /* Prevent copying */
> OutputStream(const OutputStream &f);
>
> /** Re-create the in a new location if recreateable. */
> virtual void relocate(const OutputDirectory &dir);
>
> /** Name in output directory */
> const std::string _name;
>
> /** Underlying output stream */
> std::ostream *const _stream;
> };
>
> template<class StreamType>
> class OutputFile
> : public OutputStream
> {
> public:
> typedef StreamType stream_type_t;
>
> virtual ~OutputFile();
>
> /**
> * Can the file be recreated if the output directory is moved?
> *
> * @return true if the file will be created in the new location,
> * false otherwise.
> */
> bool recreateable() const override { return _recreateable; }
>
> protected:
> friend class OutputDirectory;
>
> OutputFile(const OutputDirectory &dir,
> const std::string &name,
> std::ios_base::openmode mode,
> bool recreateable);
>
> /* Prevent copying */
> OutputFile(const OutputFile<StreamType> &f);
>
> /** Re-create the file in a new location if it is relocatable. */
> void relocate(const OutputDirectory &dir) override;
>
> /** File mode when opened */
> const std::ios_base::openmode _mode;
>
> /** Can the file be recreated in a new location? */
> const bool _recreateable;
>
> /** Pointer to the file stream */
> stream_type_t *const _fstream;
> };
>
44c143
< typedef std::map<std::string, std::ostream *> map_t;
---
> typedef std::map<std::string, OutputStream *> file_map_t;
45a145,147
> /** Output subdirectories */
> typedef std::map<std::string, OutputDirectory *> dir_map_t;
>
47c149
< map_t files;
---
> file_map_t files;
48a151,153
> /** Output sub-directories */
> dir_map_t dirs;
>
54a160,162
> static OutputStream stdout;
> static OutputStream stderr;
>
64c172
< std::ostream *checkForStdio(const std::string &name) const;
---
> static OutputStream *checkForStdio(const std::string &name);
69a178,180
> /** Constructor. */
> OutputDirectory(const std::string &name);
>
83,96d193
< /** Opens a file (optionally compressed).
< *
< * Will open a file as a compressed stream if filename ends in .gz.
< *
< * @param filename file to open
< * @param mode attributes to open file with
< * @param no_gz true to disable opening the file as a gzip compressed output
< * stream; false otherwise
< * @return stream pointer to opened file; will cause sim fail on error
< */
< std::ostream *openFile(const std::string &filename,
< std::ios_base::openmode mode = std::ios::trunc,
< bool no_gz = false);
<
112c209,210
< * Will open a file as a compressed stream if filename ends in .gz.
---
> * Will open a file as a compressed stream if filename ends in .gz, unless
> * explicitly disabled.
113a212,216
> * Relative output paths will result in the creation of a
> * recreateable (see OutputFile) output file in the current output
> * directory. Files created with an absolute path will not be
> * recreateable.
> *
117,119c220,222
< * @param no_gz true to disable creating a gzip compressed output stream;
< * false otherwise
< * @return stream to the opened file
---
> * @param no_gz true to disable opening the file as a gzip compressed output
> * stream; false otherwise
> * @return OutputStream instance representing the created file
121c224,225
< std::ostream *create(const std::string &name, bool binary = false,
---
> OutputStream *create(const std::string &name,
> bool binary = false,
125c229
< * Closes a file stream.
---
> * Open a file in this directory (optionally compressed).
127c231,232
< * Stream must have been opened through this interface, or sim will fail.
---
> * Will open a file as a compressed stream if filename ends in .gz, unless
> * explicitly disabled.
129c234,240
< * @param openStream open stream to close
---
> * @param filename file to open
> * @param mode attributes to open file with
> * @param recreateable Set to true if the file can be recreated in a new
> * location.
> * @param no_gz true to disable opening the file as a gzip compressed output
> * stream; false otherwise
> * @return OutputStream instance representing the opened file
131c242,245
< void close(std::ostream *openStream);
---
> OutputStream *open(const std::string &name,
> std::ios_base::openmode mode,
> bool recreateable = true,
> bool no_gz = false);
134,136c248,254
< * Finds stream associated with a file.
< * @param name of file
< * @return stream to specified file or NULL if file does not exist
---
> * Closes an output file and free the corresponding OutputFile.
> *
> * The output file must have been opened by the same
> * OutputDirectory instance as the one closing it, or sim will
> * fail.
> *
> * @param file OutputStream instance in this OutputDirectory.
138c256
< std::ostream *find(const std::string &name) const;
---
> void close(OutputStream *file);
141,143c259,262
< * Returns true if stream is open and not standard output or error.
< * @param os output stream to evaluate
< * @return true if os is non-NULL and not cout or cerr
---
> * Finds stream associated with an open file or stdout/stderr.
> *
> * @param name of file
> * @return stream to specified file or NULL if file does not exist
145c264
< static bool isFile(const std::ostream *os);
---
> OutputStream *find(const std::string &name) const;
146a266,267
> OutputStream *findOrCreate(const std::string &name, bool binary = false);
>
156,158c277
< * Returns true if stream is open and not standard output or error.
< * @param os output stream to evaluate
< * @return true if os is non-NULL and not cout or cerr
---
> * Test if a path is absolute.
160,161c279,280
< static inline bool isFile(const std::ostream &os) {
< return isFile(&os);
---
> static inline bool isAbsolute(const std::string &name) {
> return name[0] == PATH_SEPARATOR;
169c288
< std::string createSubdirectory(const std::string &name) const;
---
> OutputDirectory *createSubdirectory(const std::string &name);