| 1871 | } |
| 1872 | |
| 1873 | static void setHasFlags(const pb_msgdesc_t* fields, void* s) |
| 1874 | { |
| 1875 | pb_field_iter_t iter; |
| 1876 | if (!pb_field_iter_begin(&iter, fields, s)) |
| 1877 | { |
| 1878 | return; |
| 1879 | } |
| 1880 | |
| 1881 | do |
| 1882 | { |
| 1883 | // Not implemented for extension fields |
| 1884 | assert(PB_LTYPE(iter.type) != PB_LTYPE_EXTENSION); |
| 1885 | |
| 1886 | switch (PB_HTYPE(iter.type)) |
| 1887 | { |
| 1888 | case PB_HTYPE_OPTIONAL: |
| 1889 | { |
| 1890 | *reinterpret_cast<bool*>(iter.pSize) = true; |
| 1891 | |
| 1892 | // Recurse into sub-messages |
| 1893 | if (PB_LTYPE(iter.type) == PB_LTYPE_SUBMESSAGE) |
| 1894 | { |
| 1895 | assert(iter.submsg_desc); |
| 1896 | assert(iter.pData); |
| 1897 | |
| 1898 | setHasFlags(iter.submsg_desc, iter.pData); |
| 1899 | } |
| 1900 | break; |
| 1901 | } |
| 1902 | |
| 1903 | case PB_HTYPE_REPEATED: |
| 1904 | { |
| 1905 | // Recurse into sub-messages |
| 1906 | if (PB_LTYPE(iter.type) == PB_LTYPE_SUBMESSAGE) |
| 1907 | { |
| 1908 | assert(iter.submsg_desc); |
| 1909 | assert(iter.pData); |
| 1910 | assert(iter.pSize); |
| 1911 | |
| 1912 | const pb_size_t array_size = *reinterpret_cast<pb_size_t*>(iter.pSize); |
| 1913 | pb_byte_t* item_ptr = reinterpret_cast<pb_byte_t*>(iter.pData); |
| 1914 | for (pb_size_t index = 0; index < array_size; ++index) |
| 1915 | { |
| 1916 | setHasFlags(iter.submsg_desc, item_ptr); |
| 1917 | item_ptr += iter.data_size; |
| 1918 | } |
| 1919 | } |
| 1920 | break; |
| 1921 | } |
| 1922 | |
| 1923 | default: |
| 1924 | // We do not support any other htypes of fields |
| 1925 | assert(false); |
| 1926 | continue; |
| 1927 | } |
| 1928 | } while (pb_field_iter_next(&iter)); |
| 1929 | } |
| 1930 |
no test coverage detected