parent
ea1d3acfb4
commit
6cb7cb3691
@ -1,2 +1,4 @@
|
||||
cc_library(stringpiece SRCS piece.cc)
|
||||
cc_test(stringpiece_test SRCS piece_test.cc DEPS stringpiece glog gflags)
|
||||
|
||||
cc_test(stringprintf_test SRCS printf_test.cc DEPS glog gflags)
|
||||
|
@ -0,0 +1,105 @@
|
||||
/*
|
||||
Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// Compared with std::stringstream, there are primary purpose of
|
||||
// string::Printf:
|
||||
//
|
||||
// 1. Type-safe printing, with why and how explained in
|
||||
// http://www.drdobbs.com/stringprintf-a-typesafe-printf-family-fo/184401999.
|
||||
// Implementation includes
|
||||
//
|
||||
// https://github.com/c42f/tinyformat
|
||||
// boost::format
|
||||
// std::stringstream
|
||||
//
|
||||
// std::stringstream is not convenient enough in many cases. For example:
|
||||
//
|
||||
// std::cout << std::setprecision(2) << std::fixed << 1.23456 << "\n";
|
||||
//
|
||||
// boost::format is the most convenient one. We can have
|
||||
//
|
||||
// std::cout << format("%2% %1%") % 36 % 77;
|
||||
//
|
||||
// or
|
||||
//
|
||||
// format fmter("%2% %1%");
|
||||
// fmter % 36; fmter % 77;
|
||||
// std::cout << fmter.c_str();
|
||||
//
|
||||
// But the overloading of % might be overkilling and it would be
|
||||
// more efficient if it can write to std::cout directly.
|
||||
//
|
||||
// tinyformat has an interface compatible with the C-printf style,
|
||||
// and it can writes to a stream or returns a std::string:
|
||||
//
|
||||
// std::cout << tfm::printf(
|
||||
// "%s, %s %d, %.2d:%.2d\n",
|
||||
// weekday, month, day, hour, min);
|
||||
//
|
||||
// or
|
||||
//
|
||||
// tfm::format(std::cout,
|
||||
// "%s, %s %d, %.2d:%.2d\n",
|
||||
// weekday, month, day, hour, min);
|
||||
//
|
||||
// 2. High-performance -- most printed strings are not too long and
|
||||
// doens't need dynamic memory allocation. Many StringPrintf
|
||||
// implementations doesn't enforce type-safe, but are
|
||||
// high-performance, including
|
||||
//
|
||||
// https://developers.google.com/optimization/reference/base/stringprintf/
|
||||
// https://github.com/adobe/chromium/blob/master/base/stringprintf.h
|
||||
// https://github.com/google/protobuf/blob/master/src/google/protobuf/stubs/stringprintf.h
|
||||
//
|
||||
// According to
|
||||
// https://github.com/c42f/tinyformat#compile-time-and-code-bloat,
|
||||
// boost::format runs too slow and results in large executable binary
|
||||
// files. So here we port tinyformat.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include "paddle/string/tinyformat/tinyformat.h" // https://github.com/c42f/tinyformat
|
||||
|
||||
namespace paddle {
|
||||
namespace string {
|
||||
|
||||
template <typename... Args>
|
||||
void Fprintf(std::ostream& out, const char* fmt, const Args&... args) {
|
||||
tinyformat::vformat(out, fmt, makeFormatList(args...));
|
||||
}
|
||||
|
||||
template <typename... Args>
|
||||
std::string Sprintf(const char* fmt, const Args&... args) {
|
||||
std::ostringstream oss;
|
||||
tinyformat::format(oss, fmt, args...);
|
||||
return oss.str();
|
||||
}
|
||||
|
||||
template <typename... Args>
|
||||
void printf(const char* fmt, const Args&... args) {
|
||||
tinyformat::format(std::cout, fmt, args...);
|
||||
}
|
||||
|
||||
template <typename... Args>
|
||||
void printfln(const char* fmt, const Args&... args) {
|
||||
tinyformat::format(std::cout, fmt, args...);
|
||||
std::cout << '\n';
|
||||
}
|
||||
|
||||
} // namespace string
|
||||
} // namespace paddle
|
@ -0,0 +1,16 @@
|
||||
#include "paddle/string/printf.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
TEST(StringPrintf, StringPrintf) {
|
||||
std::string weekday = "Wednesday";
|
||||
const char* month = "July";
|
||||
size_t day = 27;
|
||||
long hour = 14;
|
||||
int min = 44;
|
||||
EXPECT_EQ(std::string("Wednesday, July 27, 14:44"),
|
||||
paddle::string::Sprintf(
|
||||
"%s, %s %d, %.2d:%.2d", weekday, month, day, hour, min));
|
||||
}
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue