8 bool ParseArcs(const char * str, size_t length, unsigned * a, size_t * pos)
12 const char * left = str;
16 while ((left - str) < length)
19 unsigned arc = strtoul(left, &pos, 10);
31 bool StringToArcs(const char * str, size_t length, std::vector<unsigned> & arcs)
36 if (!ParseArcs(str, length, a, &pos))
39 arcs.assign(a, a + pos);
43 bool AppendToArcs(const char * str, size_t length, std::vector<unsigned> & arcs)
48 if (!ParseArcs(str, length, a, &pos))
51 std::copy(&a[0], &a[pos], std::back_inserter(arcs));
55 OID::OID(const std::string & str)
57 if (!StringToArcs(str.c_str(), str.length(), arcs))
58 throw std::runtime_error("Invalid oid");
61 OID::OID(const char * str, size_t length)
63 if (!StringToArcs(str, length, arcs))
64 throw std::runtime_error("Invalid oid");
67 OID::OID(const std::vector<unsigned> & a)
72 OID::OID(const unsigned * a, size_t length)
74 std::vector<unsigned> newArcs(a, a + length);
78 OID::OID(OBJECT_IDENTIFIER_t * oid)
81 int count = OBJECT_IDENTIFIER_get_arcs(oid, a, sizeof(a[0]), 1024);
84 throw std::runtime_error("OID is too long");
86 std::vector<unsigned> newArcs(a, a + count);
90 OID::OID(const OID & rvalue)
99 bool OID::addSuffix(const char * suffix, size_t length)
101 if (!AppendToArcs(suffix, length, arcs))
106 bool OID::addSuffix(const std::string & suffix)
108 if (!AppendToArcs(suffix.c_str(), suffix.length(), arcs))
113 bool OID::addSuffix(const unsigned * suffix, size_t length)
115 std::copy(suffix, suffix + length, std::back_inserter(arcs));
119 bool OID::addSuffix(const std::vector<unsigned> & suffix)
121 std::copy(suffix.begin(), suffix.end(), std::back_inserter(arcs));
125 bool OID::addSuffix(unsigned a, unsigned b)
132 OID OID::copyWithSuffix(const char * suffix, size_t length) const
135 if (!oid.addSuffix(suffix, length))
136 throw std::runtime_error("Invalid suffix");
140 OID OID::copyWithSuffix(const std::string & suffix) const
143 if (!oid.addSuffix(suffix))
144 throw std::runtime_error("Invalid suffix");
148 OID OID::copyWithSuffix(const unsigned * suffix, size_t length) const
151 if (!oid.addSuffix(suffix, length))
152 throw std::runtime_error("Invalid suffix");
156 OID OID::copyWithSuffix(const std::vector<unsigned> & suffix) const
159 if (!oid.addSuffix(suffix))
160 throw std::runtime_error("Invalid suffix");
164 OID OID::copyWithSuffix(unsigned a, unsigned b) const
171 std::string OID::ToString() const
173 std::stringstream stream;
174 for (size_t i = 0; i < arcs.size(); ++i)
175 stream << "." << arcs[i];
179 void OID::ToOID(OBJECT_IDENTIFIER_t * oid) const
181 OBJECT_IDENTIFIER_set_arcs(oid, &arcs.front(), sizeof(unsigned), arcs.size());
184 OID & OID::operator=(const OID & rvalue)
190 bool OID::operator==(const OID & rvalue) const
192 if (arcs.size() != rvalue.arcs.size())
194 for (size_t i = 0; i < arcs.size(); ++i)
195 if (arcs[i] != rvalue.arcs[i])
200 bool OID::operator<(const OID & rvalue) const
203 size_t min = std::min(arcs.size(), rvalue.arcs.size());
205 arcs[i] == rvalue.arcs[i])
209 if (rvalue.arcs.size() > arcs.size())
214 if (arcs[i] < rvalue.arcs[i])
220 bool OID::PrefixLess(const OID & rvalue) const
223 size_t min = std::min(arcs.size(), rvalue.arcs.size());
225 arcs[i] == rvalue.arcs[i])
229 if (arcs[i] < rvalue.arcs[i])
234 std::ostream & operator<<(std::ostream & stream, const OID & oid)
236 for (size_t i = 0; i < oid.arcs.size(); ++i)
237 stream << "." << oid.arcs[i];