![]() |
![]() |
|
|
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: 1st May 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 12 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 /* ////////////////////////////////////////////////////////////////////// */
|
|
FastFormat Library documentation © Matthew Wilson, 2006-2009 |
|