parent
ea1d3acfb4
commit
6cb7cb3691
@ -1,2 +1,4 @@
|
|||||||
cc_library(stringpiece SRCS piece.cc)
|
cc_library(stringpiece SRCS piece.cc)
|
||||||
cc_test(stringpiece_test SRCS piece_test.cc DEPS stringpiece glog gflags)
|
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