Synesis Software STLSoft - ... Robust, Lightweight, Cross-platform, Template Software ...

fastformat/util/sinks/helpers.hpp

Go to the documentation of this file.
00001 /* /////////////////////////////////////////////////////////////////////////
00002  * File:        fastformat/util/sinks/helpers.hpp
00003  *
00004  * Purpose:     Sink implementation helper functions for the FastFormat
00005  *              library.
00006  *
00007  * Created:     19th December 2007
00008  * Updated:     11th August 2009
00009  *
00010  * Home:        http://www.fastformat.org/
00011  *
00012  * Copyright (c) 2007-2009, Matthew Wilson and Synesis Software
00013  * All rights reserved.
00014  *
00015  * Redistribution and use in source and binary forms, with or without
00016  * modification, are permitted provided that the following conditions are
00017  * met:
00018  *
00019  * - Redistributions of source code must retain the above copyright notice,
00020  *   this list of conditions and the following disclaimer.
00021  * - Redistributions in binary form must reproduce the above copyright
00022  *   notice, this list of conditions and the following disclaimer in the
00023  *   documentation and/or other materials provided with the distribution.
00024  * - Neither the names of Matthew Wilson and Synesis Software nor the names
00025  *   of any contributors may be used to endorse or promote products derived
00026  *   from this software without specific prior written permission.
00027  *
00028  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
00029  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
00030  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00031  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
00032  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00033  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00034  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00035  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00036  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00037  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00038  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00039  *
00040  * ////////////////////////////////////////////////////////////////////// */
00041 
00042 
00049 #ifndef FASTFORMAT_INCL_FASTFORMAT_UTIL_SINKS_HPP_HELPERS
00050 #define FASTFORMAT_INCL_FASTFORMAT_UTIL_SINKS_HPP_HELPERS
00051 
00052 /* /////////////////////////////////////////////////////////////////////////
00053  * Version information
00054  */
00055 
00056 #ifndef FASTFORMAT_DOCUMENTATION_SKIP_SECTION
00057 # define FASTFORMAT_VER_FASTFORMAT_UTIL_SINKS_HPP_HELPERS_MAJOR     1
00058 # define FASTFORMAT_VER_FASTFORMAT_UTIL_SINKS_HPP_HELPERS_MINOR     2
00059 # define FASTFORMAT_VER_FASTFORMAT_UTIL_SINKS_HPP_HELPERS_REVISION  1
00060 # define FASTFORMAT_VER_FASTFORMAT_UTIL_SINKS_HPP_HELPERS_EDIT      13
00061 #endif /* !FASTFORMAT_DOCUMENTATION_SKIP_SECTION */
00062 
00063 /* /////////////////////////////////////////////////////////////////////////
00064  * Language
00065  */
00066 
00067 #ifndef __cplusplus
00068 # error This file can only be included in C++ compilation units
00069 #endif /* !__cplusplus */
00070 
00071 /* /////////////////////////////////////////////////////////////////////////
00072  * Includes
00073  */
00074 
00075 #include <fastformat/fastformat.h>
00076 #include <fastformat/quality/contract.h>
00077 #include <fastformat/format/standard_flags.hpp>
00078 
00079 #include <platformstl/error/exceptions.hpp>
00080 #include <stlsoft/memory/auto_buffer.hpp>
00081 
00082 #include <string>
00083 
00084 /* /////////////////////////////////////////////////////////////////////////
00085  * Namespace
00086  */
00087 
00088 #if !defined(FASTFORMAT_NO_NAMESPACE)
00089 namespace fastformat
00090 {
00091 namespace util
00092 {
00093 #endif /* !FASTFORMAT_NO_NAMESPACE */
00094 
00095 /* /////////////////////////////////////////////////////////////////////////
00096  * Functions
00097  */
00098 
00099 
00117 template <typename B>
00118 inline size_t concat_slices(B& buff, size_t numResults, ff_string_slice_t const* results)
00119 {
00120     ff_char_t*  p       =   &buff[0];
00121     size_t      total   =   0;
00122 
00123     { for(size_t i = 0; i != numResults; ++i, ++results)
00124     {
00125         FASTFORMAT_CONTRACT_ENFORCE_PRECONDITION_STATE_INTERNAL(total + results->len <= buff.size(), "insufficient space in buffer to write the results");
00126 
00127         STLSOFT_SUPPRESS_UNUSED(total);
00128 
00129         ::memcpy(p, results->ptr, results->len * sizeof(ff_char_t));
00130 
00131         p       +=  results->len;
00132         total   +=  results->len;
00133     }}
00134 
00135     return total;
00136 }
00137 
00150 inline size_t concat_slices(size_t cchBuff, ff_char_t* buff, size_t numResults, ff_string_slice_t const* results)
00151 {
00152     STLSOFT_SUPPRESS_UNUSED(cchBuff);
00153 
00154     ff_char_t*  p       =   &buff[0];
00155     size_t      total   =   0;
00156 
00157     { for(size_t i = 0; i != numResults; ++i, ++results)
00158     {
00159         FASTFORMAT_CONTRACT_ENFORCE_PRECONDITION_STATE_INTERNAL(total + results->len <= cchBuff, "insufficient space in buffer to write the results");
00160 
00161         STLSOFT_SUPPRESS_UNUSED(total);
00162 
00163         ::memcpy(p, results->ptr, results->len * sizeof(ff_char_t));
00164 
00165         p       +=  results->len;
00166         total   +=  results->len;
00167     }}
00168 
00169     return total;
00170 }
00171 
00172 /* /////////////////////////////////////////////////////////////////////////
00173  * Namespace
00174  */
00175 
00176 #if !defined(FASTFORMAT_NO_NAMESPACE)
00177 } /* namespace util */
00178 } /* namespace fastformat */
00179 #endif /* !FASTFORMAT_NO_NAMESPACE */
00180 
00181 /* ////////////////////////////////////////////////////////////////////// */
00182 
00183 #endif /* FASTFORMAT_INCL_FASTFORMAT_UTIL_SINKS_HPP_HELPERS */
00184 
00185 /* ///////////////////////////// end of file //////////////////////////// */

FastFormat Library documentation © Matthew Wilson, 2006-2009 SourceForge.net Logo