From 801992d49afe770bc2f240735028e161da11c532 Mon Sep 17 00:00:00 2001 From: Andy Schwerin Date: Fri, 21 Sep 2012 14:52:49 -0400 Subject: parseNumberFromString* functions A uniform interface for parsing numbers out of strings, with implementations for the standard integer types. Extension to double should be straightforward. Tests included. --- src/mongo/base/parse_number.h | 74 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/mongo/base/parse_number.h (limited to 'src/mongo/base/parse_number.h') diff --git a/src/mongo/base/parse_number.h b/src/mongo/base/parse_number.h new file mode 100644 index 00000000000..490e163ada2 --- /dev/null +++ b/src/mongo/base/parse_number.h @@ -0,0 +1,74 @@ +/* Copyright 2012 10gen Inc. + * + * 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. + */ + +/** + * Utility functions for parsing numbers from strings. + */ + +#pragma once + +#include + +#include "mongo/base/status.h" + +namespace mongo { + + /** + * Parse a number out of a string. + * + * Parses "stringValue", interpreting it as a number of the given "base". On success, stores + * the parsed value into "*result" and returns Status::OK(). + * + * Valid values for "base" are 2-36, with 0 meaning "choose the base by inspecting the prefix + * on the number", as in strtol. Returns Status::BadValue if an illegal value is supplied for + * "base". + * + * The entirety of the string must consist of digits in the given base, except optionally the + * first character may be "+" or "-", and hexadecimal numbers may begin "0x". Same as strtol, + * without the property of stripping whitespace at the beginning, and fails to parse if there + * are non-digit characters at the end of the string. + * + * See parse_number.cpp for the available instantiations, and add any new instantiations there. + */ + template + Status parseNumberFromStringWithBase(const char* stringValue, int base, NumberType* result); + + /** + * Equivalent to parseNumberFromStringWithBase(stringValue, 0, result); + */ + template + static inline Status parseNumberFromString(const char* stringValue, NumberType* result) { + return parseNumberFromStringWithBase(stringValue, 0, result); + } + + /** + * Same as parseNumberFromStringWithBase, above, but taking a std::string instead of a c-style + * string. + */ + template + static inline Status parseNumberFromStringWithBase( + const std::string& stringValue, int base, NumberType* result) { + return parseNumberFromStringWithBase(stringValue.c_str(), base, result); + } + + /** + * Same as parseNumberFromString, above, but taking a std::string instead of a c-style string. + */ + template + static inline Status parseNumberFromString(const std::string& stringValue, NumberType* result) { + return parseNumberFromString(stringValue.c_str(), result); + } + +} // namespace mongo -- cgit v1.2.1