| 36 | { |
| 37 | template <typename octet_iterator> |
| 38 | octet_iterator append(uint32_t cp, octet_iterator result) |
| 39 | { |
| 40 | if (cp < 0x80) // one octet |
| 41 | *(result++) = static_cast<uint8_t>(cp); |
| 42 | else if (cp < 0x800) { // two octets |
| 43 | *(result++) = static_cast<uint8_t>((cp >> 6) | 0xc0); |
| 44 | *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80); |
| 45 | } |
| 46 | else if (cp < 0x10000) { // three octets |
| 47 | *(result++) = static_cast<uint8_t>((cp >> 12) | 0xe0); |
| 48 | *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80); |
| 49 | *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80); |
| 50 | } |
| 51 | else { // four octets |
| 52 | *(result++) = static_cast<uint8_t>((cp >> 18) | 0xf0); |
| 53 | *(result++) = static_cast<uint8_t>(((cp >> 12) & 0x3f)| 0x80); |
| 54 | *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80); |
| 55 | *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80); |
| 56 | } |
| 57 | return result; |
| 58 | } |
| 59 | |
| 60 | template <typename octet_iterator> |
| 61 | uint32_t next(octet_iterator& it) |