diff options
author | Brad King <brad.king@kitware.com> | 2001-05-16 20:40:45 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2001-05-16 20:40:45 (GMT) |
commit | 8011fe0fadb8a57e5086b97a0d3cd783207fae07 (patch) | |
tree | d0dd2b95247f264dca1cfc25d72caf5ec5f2ed68 /Source/cmGeneratedFileStream.h | |
parent | b9cfc413fc7a7c73619c2b49f2b2e3d0c35bb65c (diff) | |
download | CMake-8011fe0fadb8a57e5086b97a0d3cd783207fae07.zip CMake-8011fe0fadb8a57e5086b97a0d3cd783207fae07.tar.gz CMake-8011fe0fadb8a57e5086b97a0d3cd783207fae07.tar.bz2 |
ENH: cmGeneratedFileStream class added to simplify copy-if-different usage on generated files.
Diffstat (limited to 'Source/cmGeneratedFileStream.h')
-rw-r--r-- | Source/cmGeneratedFileStream.h | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/Source/cmGeneratedFileStream.h b/Source/cmGeneratedFileStream.h new file mode 100644 index 0000000..e372eed --- /dev/null +++ b/Source/cmGeneratedFileStream.h @@ -0,0 +1,142 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + +Copyright (c) 2001 Insight Consortium +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * The name of the Insight Consortium, nor the names of any consortium members, + nor of any contributors, may be used to endorse or promote products derived + from this software without specific prior written permission. + + * Modified source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +=========================================================================*/ +#ifndef cmGeneratedFileStream_h +#define cmGeneratedFileStream_h + +#include "cmStandardIncludes.h" + +/** \class cmGeneratedFileStream + * \brief Output stream for generated files that does copy-if-different. + * + * Many files generated by CMake don't change each time they are generated. + * This class can be used in place of std::ofstream to open a file and + * write output to it. The class will automatically write output to a + * temporary file and copy it over an existing file only if the generated + * file has changed. + */ +class cmGeneratedFileStream +{ +public: + /** + * The constructor takes the name of the file to be generated. It + * automatically generates a name for the temporary file. + */ + cmGeneratedFileStream(const char* name): + m_Name(name), + m_TempName(m_Name+".tmp"), + m_Stream(m_TempName.c_str()), + m_Copied(false) + {} + + /** + * The destructor ensures that the file has been closed and copied if + * it has changed. + */ + ~cmGeneratedFileStream() { this->DoCopy(); } + + /** + * Get the real output stream. + */ + std::ostream& GetStream() { return m_Stream; } + + /** + * Allow a test for whether the file is open. + */ + operator bool() const { return m_Stream; } + + /** + * Close the file stream. This will cause the copy-if-different to the + * real file name to occur. + */ + void close() { this->DoCopy(); } + +private: + /** + * The name of the real file where output will be copied if it has changed. + */ + std::string m_Name; + + /** + * The name of the temporary file. + */ + std::string m_TempName; + + /** + * The real output stream used to write to the file. + */ + std::ofstream m_Stream; + + /** + * Whether the temporary file has already been copied to the real file. + */ + bool m_Copied; + + /** + * Closes the temporary file and does the copy-if-different to the real file. + */ + void DoCopy() + { + if(!m_Copied) + { + m_Stream.close(); + cmSystemTools::CopyFileIfDifferent(m_TempName.c_str(), m_Name.c_str()); + cmSystemTools::RemoveFile(m_TempName.c_str()); + m_Copied = true; + } + } +}; + + +/** + * Allow a cmGeneratedFileStream to be used just as a real std::ostream + * would be. + */ +template <class T> +std::ostream& operator << (cmGeneratedFileStream& l, const T& r) +{ + std::ostream& os = l.GetStream(); + os << r; + return os; +} + + + +#endif |