Publishing 2019 R1 content
[platform/upstream/dldt.git] / inference-engine / thirdparty / clDNN / utils / rapidjson / istreamwrapper.h
1 // Tencent is pleased to support the open source community by making RapidJSON available.
2 // 
3 // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
4 //
5 // Licensed under the MIT License (the "License"); you may not use this file except
6 // in compliance with the License. You may obtain a copy of the License at
7 //
8 // http://opensource.org/licenses/MIT
9 //
10 // Unless required by applicable law or agreed to in writing, software distributed 
11 // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 
12 // CONDITIONS OF ANY KIND, either express or implied. See the License for the 
13 // specific language governing permissions and limitations under the License.
14
15 #ifndef RAPIDJSON_ISTREAMWRAPPER_H_
16 #define RAPIDJSON_ISTREAMWRAPPER_H_
17
18 #include "stream.h"
19 #include <iosfwd>
20
21 #ifdef __clang__
22 RAPIDJSON_DIAG_PUSH
23 RAPIDJSON_DIAG_OFF(padded)
24 #elif defined(_MSC_VER)
25 RAPIDJSON_DIAG_PUSH
26 RAPIDJSON_DIAG_OFF(4351) // new behavior: elements of array 'array' will be default initialized
27 #endif
28
29 RAPIDJSON_NAMESPACE_BEGIN
30
31 //! Wrapper of \c std::basic_istream into RapidJSON's Stream concept.
32 /*!
33     The classes can be wrapped including but not limited to:
34
35     - \c std::istringstream
36     - \c std::stringstream
37     - \c std::wistringstream
38     - \c std::wstringstream
39     - \c std::ifstream
40     - \c std::fstream
41     - \c std::wifstream
42     - \c std::wfstream
43
44     \tparam StreamType Class derived from \c std::basic_istream.
45 */
46    
47 template <typename StreamType>
48 class BasicIStreamWrapper {
49 public:
50     typedef typename StreamType::char_type Ch;
51     BasicIStreamWrapper(StreamType& stream) : stream_(stream), count_(), peekBuffer_() {}
52
53     Ch Peek() const { 
54         typename StreamType::int_type c = stream_.peek();
55         return RAPIDJSON_LIKELY(c != StreamType::traits_type::eof()) ? static_cast<Ch>(c) : static_cast<Ch>('\0');
56     }
57
58     Ch Take() { 
59         typename StreamType::int_type c = stream_.get();
60         if (RAPIDJSON_LIKELY(c != StreamType::traits_type::eof())) {
61             count_++;
62             return static_cast<Ch>(c);
63         }
64         else
65             return '\0';
66     }
67
68     // tellg() may return -1 when failed. So we count by ourself.
69     size_t Tell() const { return count_; }
70
71     Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; }
72     void Put(Ch) { RAPIDJSON_ASSERT(false); }
73     void Flush() { RAPIDJSON_ASSERT(false); }
74     size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; }
75
76     // For encoding detection only.
77     const Ch* Peek4() const {
78         RAPIDJSON_ASSERT(sizeof(Ch) == 1); // Only usable for byte stream.
79         int i;
80         bool hasError = false;
81         for (i = 0; i < 4; ++i) {
82             typename StreamType::int_type c = stream_.get();
83             if (c == StreamType::traits_type::eof()) {
84                 hasError = true;
85                 stream_.clear();
86                 break;
87             }
88             peekBuffer_[i] = static_cast<Ch>(c);
89         }
90         for (--i; i >= 0; --i)
91             stream_.putback(peekBuffer_[i]);
92         return !hasError ? peekBuffer_ : 0;
93     }
94
95 private:
96     BasicIStreamWrapper(const BasicIStreamWrapper&);
97     BasicIStreamWrapper& operator=(const BasicIStreamWrapper&);
98
99     StreamType& stream_;
100     size_t count_;  //!< Number of characters read. Note:
101     mutable Ch peekBuffer_[4];
102 };
103
104 typedef BasicIStreamWrapper<std::istream> IStreamWrapper;
105 typedef BasicIStreamWrapper<std::wistream> WIStreamWrapper;
106
107 #if defined(__clang__) || defined(_MSC_VER)
108 RAPIDJSON_DIAG_POP
109 #endif
110
111 RAPIDJSON_NAMESPACE_END
112
113 #endif // RAPIDJSON_ISTREAMWRAPPER_H_