diff options
author | Andy Schwerin <schwerin@10gen.com> | 2012-09-21 14:52:49 -0400 |
---|---|---|
committer | Andy Schwerin <schwerin@10gen.com> | 2012-09-25 15:05:32 -0400 |
commit | 801992d49afe770bc2f240735028e161da11c532 (patch) | |
tree | 0a1b85c8f7758d6c55a1c04811732011fae34c82 /src/mongo/base/parse_number.h | |
parent | 3aa13e9159d839760b54419fd54636cd11ae5e8b (diff) | |
download | mongo-801992d49afe770bc2f240735028e161da11c532.tar.gz |
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.
Diffstat (limited to 'src/mongo/base/parse_number.h')
-rw-r--r-- | src/mongo/base/parse_number.h | 74 |
1 files changed, 74 insertions, 0 deletions
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 <string> + +#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 <typename NumberType> + Status parseNumberFromStringWithBase(const char* stringValue, int base, NumberType* result); + + /** + * Equivalent to parseNumberFromStringWithBase(stringValue, 0, result); + */ + template <typename NumberType> + 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 <typename NumberType> + 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 <typename NumberType> + static inline Status parseNumberFromString(const std::string& stringValue, NumberType* result) { + return parseNumberFromString(stringValue.c_str(), result); + } + +} // namespace mongo |