{"id":543,"date":"2018-03-04T22:25:24","date_gmt":"2018-03-04T22:25:24","guid":{"rendered":"http:\/\/cppdepend.com\/blog\/?p=543"},"modified":"2023-05-31T16:15:11","modified_gmt":"2023-05-31T16:15:11","slug":"cpp-algorithm-evolution-historical-flashback","status":"publish","type":"post","link":"https:\/\/cppdepend.com\/blog\/cpp-algorithm-evolution-historical-flashback\/","title":{"rendered":"C++ Algorithm Evolution: A Historical Flashback"},"content":{"rendered":"<p>Before the initial standardization in 1998, C++ was developed by\u00a0Bjarne Stroustrup\u00a0at\u00a0Bell Labs\u00a0since 1979, as an extension of the\u00a0C language\u00a0as he wanted an efficient and flexible language similar to C<\/p>\n<p>In 1983, &#8220;C with Classes&#8221; was renamed to &#8220;C++&#8221; , adding new features that included\u00a0virtual functions, function name and\u00a0operator overloading, references, constants, type-safe free-store memory allocation (new\/delete), improved type checking.<!--more--><\/p>\n<p>It&#8217;s interesting to know the evolution of a language to understand the motivations behind the choices made over years. For that let&#8217;s discover how the C++ algorithms\u00a0 were written from the first use of the language\u00a0the 80s until now and the best way to do a flashback is to ask google for some keywords by specifying a custom\u00a0 date range.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/www.cppdepend.com\/img\/google.png\" \/><\/p>\n<p><strong>Between 1985 and 1990<\/strong><\/p>\n<p>Let&#8217;s explore the C++ code between 1985 and 1990.\u00a0 After customizing the dates range we have a few results for the keyword &#8220;C++ algorithm&#8221;. For example we have this <a href=\"http:\/\/www.drdobbs.com\/database\/implementing-cordic-algorithms\/184408428\">link\u00a0<\/a>\u00a0from\u00a0 Dr Dobbs journal published in 1990.\u00a0 Dr Dobbs was a major actor promoting the C++ language for many years, special thanks to all the contributors who give us many interesting resources to master C++. Unfortunately\u00a0the publication ceased at the end of 2014.<\/p>\n<p>Here&#8217;s a snippet of the code.<\/p>\n<pre>WriteFraction(n) long n;\r\n{\r\n   unsigned short i, low, digit; unsigned long k;\r\n   putchar(n &lt; 0 ? '-' : ' '); n = abs(n);\r\n   putchar((n&gt;&gt;fractionBits) + '0'); putchar('.');\r\n   low = k = n &lt;&lt; (longBits-fractionBits); \/* align octal point at left *\/\r\n   k &gt;&gt;= 4; \/* shift to make room for a decimal digit *\/\r\n   for (i=1; i&lt;=8; ++i)\r\n   {\r\n      digit = (k *= 10L) &gt;&gt; (longBits-4);\r\n      low = (low &amp; 0xf) * 10;\r\n      k += ((unsigned long) (low&gt;&gt;4)) - ((unsigned long) digit &lt;&lt;   (longBits-4));\r\n      putchar(digit+'0');\r\n   }\r\n}\r\n<\/pre>\n<p>Let&#8217;s compare this code\u00a0snippet with &#8220;Microsoft Word 1.1&#8221; source code\u00a0released in the same time.\u00a0Microsoft released recently the \u201cMicrosoft Word 1.1\u2033 source code \u00a0in the \u00a0<a href=\"http:\/\/www.computerhistory.org\/atchm\/microsoft-word-for-windows-1-1a-source-code\/\">Computer History Museum.<\/a><\/p>\n<p><img decoding=\"async\" src=\"http:\/\/www.javadepend.com\/Blog\/wp-content\/uploads\/c11.png\" alt=\"c1\" \/><\/p>\n<p>These code snippets are very similar and the implementation of many C++ projects\u00a0 are similar to the C ones.\u00a0 At this time no mature libraries existed to facilitate the algorithms implementation and all the needed utilities were developed in house and from scratch.<\/p>\n<p><strong>Between\u00a090 and 95<\/strong><\/p>\n<p>When searching some source code between these dates, we can remark that many implementations are the same as the example cited before. C\u00a0 still dominate the algorithms implementations even if a big change was down to the language which opened a new ways to code the algorithms. Indeed,\u00a0In 1989, C++ 2.0 was released, followed by the updated second edition of\u00a0<i>The C++ Programming Language<\/i>\u00a0in 1991.New features in 2.0 included multiple inheritance, abstract classes, static member functions,\u00a0const member functions, and protected members. In 1990,\u00a0<i>The Annotated C++ Reference Manual<\/i>\u00a0was published. This work became the basis for the future standard. Later feature additions included\u00a0<strong>templates<\/strong>,\u00a0exceptions,\u00a0namespaces, new\u00a0casts, and a\u00a0boolean type.<\/p>\n<p>Even if the templates were introduced in 1991 only few C++ experts are interested at the generic programming paradigm and few publications talked about it.<\/p>\n<p>Alexandre Stephanov was\u00a0a pioneer C++ expert who try to explore the generic programming possibilities to provide a modern approach to develop the\u00a0 C++ projects.<\/p>\n<p>Here&#8217;s an interesting <a href=\"http:\/\/stepanovpapers.com\/algor.pdf\">document<\/a>\u00a0entitled &#8220;Algorithm-Oriented Generic Libraries&#8221; published in 1993 by Alexandre A Stepanov and David R Summer.<\/p>\n<p>Here&#8217;s the motivation from the document as explained by the authors:<\/p>\n<pre>We outline an approach to construction of software libraries in which generic algorithms (algorithmic abstractions) play a more central role than in conventional software library technology or in the object-oriented programming paradigm. Our approach is to consider algorithms first, decide what types and access operations they need for efficient execution, and regard the types and operations as formal parameters that can be instantiated in many different ways, as long as the actual parameters satisfy the assumptions on which the correctness and efficiency of the algorithms are based. The means by which instantiation is carried out is language dependent; in the C + + examples in this paper, we instantiate generic algorithms by constructing classes that define the needed types and access operations. By use of such compile-time techniques and careful attention to algorithmic issues, it is possible to construct software components of broad utility with no sacrifice of efficiency.<\/pre>\n<p>From the 1991 to 1994 a revolution driven by a few C++ pioneers to modernize the C++ is in its way to give us an efficient C++ library to code the algorithms. It&#8217;s The <strong>S<\/strong>tandard <strong>T<\/strong>emplate <strong>L<\/strong>ibrary.<\/p>\n<p><strong>Between 95 and 2000<\/strong><\/p>\n<p>The effort and amazing work of Alexandre Stephanove , David Musser,\u00a0Meng Lee and the\u00a0C++ standardization committee, a first release version of STL was released in 1994.<\/p>\n<p>The\u00a0<b>Standard Template Library<\/b>\u00a0(<b>STL<\/b>) is a\u00a0software library\u00a0for the\u00a0C++\u00a0programming language that influenced many parts of the\u00a0C++ Standard Library. It provides four components called\u00a0<i>algorithms<\/i>,\u00a0<i>containers<\/i>,\u00a0<i>functions<\/i>, and\u00a0<i>iterators<\/i>.<\/p>\n<p>The STL provides a set of common\u00a0classes\u00a0for C++, such as containers and\u00a0associative arrays, that can be used with any built-in type and with any user-defined type that supports some elementary operations (such as copying and assignment). STL algorithms are independent of containers, which significantly reduces the complexity of the library.<\/p>\n<p>From 1995 many algorithms implementations begin to use the features of the STL library, and many algorithms implementations looks like\u00a0this one <a href=\"http:\/\/citeseerx.ist.psu.edu\/viewdoc\/download?doi=10.1.1.14.5196&amp;rep=rep1&amp;type=pdf\">published in 1997<\/a> .<\/p>\n<pre>template &lt;class RandomAccessIterator, class T, class Distance&gt;\r\nvoid __introsort_loop(RandomAccessIterator first,\r\nRandomAccessIterator last, T*,\r\nDistance depth_limit) {\r\n     while (last - first &gt; __stl_threshold) {\r\n        if (depth_limit == 0) {\r\n            partial_sort(first, last, last);\r\n            return;\r\n         }\r\n     --depth_limit;\r\n     RandomAccessIterator cut = __unguarded_partition\r\n     (first, last, T(__median(*first, *(first + (last - first)\/2),\r\n     *(last - 1))));\r\n     __introsort_loop(cut, last, value_type(first), depth_limit);\r\n     last = cut;\r\n    }\r\n}\r\n<\/pre>\n<p>The STL was\u00a0a breath of fresh air to the C++ developers, it provided many interesting features needed to modernize the C++ code which makes the C++ algorithms implementations \u00a0different to the C\u00a0 implementations ones.<\/p>\n<p><strong>Between 2000 and 2010<\/strong><\/p>\n<p>In 1998 a\u00a0<a href=\"http:\/\/www.boost.org\/users\/proposal.pdf\">proposal for \u00a0a C++ Library Repository Web Site<\/a>\u00a0was posted by\u00a0Beman G. Dawes. The original vision aims to satisfy two major goals:<\/p>\n<ul>\n<li>A world-wide website containing a repository of free C++ class libraries would be of great benefit to the C++ community. Although other sites supply specific libraries or provide links to libraries, there is currently no well-known website that acts as a general repository for C++ libraries. The vision is this: a site where programmers can find the libraries they need, post libraries they would like to share, and which can act as a focal point to encourage innovative C++ library development. An online peer review process is envisioned to ensure library quality with a minimum of bureaucracy.<\/li>\n<li>Secondary goals include encouraging effective programming techniques and providing a focal point for C++ programmers to participate in a wider community. Additionally, such a site might foster C++ standards activity by helping to establish existing practice.<\/li>\n<\/ul>\n<p><b>Boost<\/b>\u00a0is a set of\u00a0libraries\u00a0for the\u00a0C++\u00a0programming language that provide support for tasks and structures such as\u00a0linear algebra,\u00a0pseudorandom number generation, multithreading,\u00a0image processing,\u00a0regular expressions, and\u00a0unit testing. It contains over eighty individual libraries.<\/p>\n<p>For example Boost provided the <a href=\"http:\/\/www.boost.org\/doc\/libs\/1_65_1\/doc\/html\/foreach.html\">Foreach <\/a>facility overused by many algorithms to iterate over the containers.<\/p>\n<pre class=\"programlisting\"><span class=\"identifier\">std<\/span><span class=\"special\">::<\/span><span class=\"identifier\">deque<\/span><span class=\"special\">&lt;<\/span><span class=\"keyword\">int<\/span><span class=\"special\">&gt;<\/span> <span class=\"identifier\">deque_int<\/span><span class=\"special\">(<\/span> <span class=\"comment\">\/*...*\/<\/span> <span class=\"special\">);<\/span>\r\n<span class=\"keyword\">int<\/span> <span class=\"identifier\">i<\/span> <span class=\"special\">=<\/span> <span class=\"number\">0<\/span><span class=\"special\">;<\/span>\r\n<span class=\"identifier\">BOOST_FOREACH<\/span><span class=\"special\">(<\/span> <span class=\"identifier\">i<\/span><span class=\"special\">,<\/span> <span class=\"identifier\">deque_int<\/span> <span class=\"special\">)<\/span>\r\n<span class=\"special\">{<\/span>\r\n    <span class=\"keyword\">if<\/span><span class=\"special\">(<\/span> <span class=\"identifier\">i<\/span> <span class=\"special\">==<\/span> <span class=\"number\">0<\/span> <span class=\"special\">)<\/span> <span class=\"keyword\">return<\/span><span class=\"special\">;<\/span>\r\n    <span class=\"keyword\">if<\/span><span class=\"special\">(<\/span> <span class=\"identifier\">i<\/span> <span class=\"special\">==<\/span> <span class=\"number\">1<\/span> <span class=\"special\">)<\/span> <span class=\"keyword\">continue<\/span><span class=\"special\">;<\/span>\r\n    <span class=\"keyword\">if<\/span><span class=\"special\">(<\/span> <span class=\"identifier\">i<\/span> <span class=\"special\">==<\/span> <span class=\"number\">2<\/span> <span class=\"special\">)<\/span> <span class=\"keyword\">break<\/span><span class=\"special\">;<\/span>\r\n<span class=\"special\">}<\/span><\/pre>\n<p>And also some common utilities\u00a0 used by the algoritms to simplify their implementations like the join method:<\/p>\n<pre class=\"default prettyprint prettyprinted\"><code><span class=\"com\">#include<\/span> <span class=\"str\">&lt;boost\/algorithm\/string\/join.hpp&gt;<\/span>\r\n<span class=\"com\">#include<\/span> <span class=\"str\">&lt;vector&gt;<\/span>\r\n<span class=\"com\">#include<\/span> <span class=\"str\">&lt;iostream&gt;<\/span>\r\n\r\n<span class=\"kwd\">int<\/span><span class=\"pln\"> main<\/span><span class=\"pun\">()<\/span>\r\n<span class=\"pun\">{<\/span><span class=\"pln\">\r\n    std<\/span><span class=\"pun\">::<\/span><span class=\"pln\">vector<\/span><span class=\"pun\">&lt;<\/span><span class=\"pln\">std<\/span><span class=\"pun\">::<\/span><span class=\"kwd\">string<\/span><span class=\"pun\">&gt;<\/span><span class=\"pln\"> list<\/span><span class=\"pun\">;<\/span><span class=\"pln\">\r\n    list<\/span><span class=\"pun\">.<\/span><span class=\"pln\">push_back<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"Hello\"<\/span><span class=\"pun\">);<\/span><span class=\"pln\">\r\n    list<\/span><span class=\"pun\">.<\/span><span class=\"pln\">push_back<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"World!\"<\/span><span class=\"pun\">);<\/span><span class=\"pln\">\r\n\r\n    std<\/span><span class=\"pun\">::<\/span><span class=\"kwd\">string<\/span><span class=\"pln\"> joined <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> boost<\/span><span class=\"pun\">::<\/span><span class=\"pln\">algorithm<\/span><span class=\"pun\">::<\/span><span class=\"pln\">join<\/span><span class=\"pun\">(<\/span><span class=\"pln\">list<\/span><span class=\"pun\">,<\/span> <span class=\"str\">\", \"<\/span><span class=\"pun\">);<\/span><span class=\"pln\">\r\n    std<\/span><span class=\"pun\">::<\/span><span class=\"pln\">cout <\/span><span class=\"pun\">&lt;&lt;<\/span><span class=\"pln\"> joined <\/span><span class=\"pun\">&lt;&lt;<\/span><span class=\"pln\"> std<\/span><span class=\"pun\">::<\/span><span class=\"pln\">endl<\/span><span class=\"pun\">;<\/span>\r\n<span class=\"pun\">}<\/span><\/code><\/pre>\n<p><strong>2010 to now<\/strong><\/p>\n<p>For many years the facilities to develop efficient algorithms comes from the libraries like STL and Bosst. Indeed, After the 2.0 update, C++ evolved relatively slowly until, in 2011 and C++ has been stagnated for many years, and many developers were confident that the language would have the same destiny as Cobol, Fortran, and VB6. On the contrary and against all odds, C++ is reborned from its ashes and the new standards are importantly changing how the language is used.<\/p>\n<p>Many interesting utilities were added to the <a href=\"http:\/\/en.cppreference.com\/w\/cpp\/algorithm\">Algorithms library<\/a>. And the algorithms implementations looks like this one:<\/p>\n<pre class=\"lang-cpp prettyprint prettyprinted\"><code><span class=\"kwd\">template<\/span><span class=\"pun\">&lt;<\/span><span class=\"kwd\">class<\/span> <span class=\"typ\">FwdIt<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">class<\/span> <span class=\"typ\">Compare<\/span> <span class=\"pun\">=<\/span><span class=\"pln\"> std<\/span><span class=\"pun\">::<\/span><span class=\"pln\">less<\/span><span class=\"pun\">&lt;&gt;&gt;<\/span>\r\n<span class=\"kwd\">void<\/span><span class=\"pln\"> quick_sort<\/span><span class=\"pun\">(<\/span><span class=\"typ\">FwdIt<\/span><span class=\"pln\"> first<\/span><span class=\"pun\">,<\/span> <span class=\"typ\">FwdIt<\/span><span class=\"pln\"> last<\/span><span class=\"pun\">,<\/span> <span class=\"typ\">Compare<\/span><span class=\"pln\"> cmp <\/span><span class=\"pun\">=<\/span> <span class=\"typ\">Compare<\/span><span class=\"pun\">{})<\/span>\r\n<span class=\"pun\">{<\/span>\r\n    <span class=\"kwd\">auto<\/span> <span class=\"kwd\">const<\/span><span class=\"pln\"> N <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> std<\/span><span class=\"pun\">::<\/span><span class=\"pln\">distance<\/span><span class=\"pun\">(<\/span><span class=\"pln\">first<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> last<\/span><span class=\"pun\">);<\/span>\r\n    <span class=\"kwd\">if<\/span> <span class=\"pun\">(<\/span><span class=\"pln\">N <\/span><span class=\"pun\">&lt;=<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">)<\/span> <span class=\"kwd\">return<\/span><span class=\"pun\">;<\/span>\r\n    <span class=\"kwd\">auto<\/span> <span class=\"kwd\">const<\/span><span class=\"pln\"> pivot <\/span><span class=\"pun\">=<\/span> <span class=\"pun\">*<\/span><span class=\"pln\">std<\/span><span class=\"pun\">::<\/span><span class=\"pln\">next<\/span><span class=\"pun\">(<\/span><span class=\"pln\">first<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> N <\/span><span class=\"pun\">\/<\/span> <span class=\"lit\">2<\/span><span class=\"pun\">);<\/span>\r\n    <span class=\"kwd\">auto<\/span> <span class=\"kwd\">const<\/span><span class=\"pln\"> middle1 <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> std<\/span><span class=\"pun\">::<\/span><span class=\"pln\">partition<\/span><span class=\"pun\">(<\/span><span class=\"pln\">first<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> last<\/span><span class=\"pun\">,<\/span> <span class=\"pun\">[=](<\/span><span class=\"kwd\">auto<\/span> <span class=\"kwd\">const<\/span><span class=\"pun\">&amp;<\/span><span class=\"pln\"> elem<\/span><span class=\"pun\">){<\/span> \r\n        <span class=\"kwd\">return<\/span><span class=\"pln\"> cmp<\/span><span class=\"pun\">(<\/span><span class=\"pln\">elem<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> pivot<\/span><span class=\"pun\">);<\/span> \r\n    <span class=\"pun\">});<\/span>\r\n    <span class=\"kwd\">auto<\/span> <span class=\"kwd\">const<\/span><span class=\"pln\"> middle2 <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> std<\/span><span class=\"pun\">::<\/span><span class=\"pln\">partition<\/span><span class=\"pun\">(<\/span><span class=\"pln\">middle1<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> last<\/span><span class=\"pun\">,<\/span> <span class=\"pun\">[=](<\/span><span class=\"kwd\">auto<\/span> <span class=\"kwd\">const<\/span><span class=\"pun\">&amp;<\/span><span class=\"pln\"> elem<\/span><span class=\"pun\">){<\/span> \r\n        <span class=\"kwd\">return<\/span> <span class=\"pun\">!<\/span><span class=\"pln\">cmp<\/span><span class=\"pun\">(<\/span><span class=\"pln\">pivot<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> elem<\/span><span class=\"pun\">);<\/span>\r\n    <span class=\"pun\">});<\/span><span class=\"pln\">\r\n    quick_sort<\/span><span class=\"pun\">(<\/span><span class=\"pln\">first<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> middle1<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> cmp<\/span><span class=\"pun\">);<\/span> <span class=\"com\">\/\/ assert(std::is_sorted(first, middle1, cmp));<\/span><span class=\"pln\">\r\n    quick_sort<\/span><span class=\"pun\">(<\/span><span class=\"pln\">middle2<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> last<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> cmp<\/span><span class=\"pun\">);<\/span>  <span class=\"com\">\/\/ assert(std::is_sorted(middle2, last, cmp));<\/span>\r\n<span class=\"pun\">}<\/span><\/code><\/pre>\n<p><strong>What&#8217;s next<\/strong><\/p>\n<p>From 1991 to 2011 the language evolved slowly and the evolution comes from the libraries like STL and Boost.\u00a0 From 2011 many features were added to the standard, we can enumerate C++11, C++14, C++17 and the coming C++20.\u00a0\u00a0it is now the turn of the libraries to provides efficient implementations based on the new standards, Folly\u00a0is a good example of the modern C++ libraries. Here&#8217;s the motivation behind its creation:<\/p>\n<pre>Folly (acronymed loosely after Facebook Open Source Library) is a library of C++11 components designed with practicality and efficiency in mind. It complements (as opposed to competing against) offerings such as Boost and of course\u00a0<code>std<\/code>. In fact, we embark on defining our own component only when something we need is either not available, or does not meet the needed performance profile.<\/pre>\n<p>Here&#8217;s a code snippet from the folly library.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/www.javadepend.com\/Blog\/wp-content\/uploads\/c0.png\" alt=\"c0\" \/><\/p>\n<p><strong>Conclusion:<\/strong><\/p>\n<p>C++ is an amazing language with which we can develop many kind of applications, fortunately it was supported and promoted by many big companies. Many C++ experts contributed to evolve and maintain its libraries and the new standards give us new ways and possibilities to modernize the C++ code base to have efficient implementations.<\/p>\n<p>C++ was declared dead many times but in the reality it reborn again and again. Finally we hope a\u00a0 Long live to C++.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Before the initial standardization in 1998, C++ was developed by\u00a0Bjarne Stroustrup\u00a0at\u00a0Bell Labs\u00a0since 1979, as an extension of the\u00a0C language\u00a0as he wanted an efficient and flexible language similar to C In 1983, &#8220;C with Classes&#8221; was renamed to &#8220;C++&#8221; , adding new features that included\u00a0virtual functions, function name and\u00a0operator overloading, references, constants, type-safe free-store memory allocation &hellip; <a href=\"https:\/\/cppdepend.com\/blog\/cpp-algorithm-evolution-historical-flashback\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;C++ Algorithm Evolution: A Historical Flashback&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[195,67,13,137],"class_list":["post-543","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-algorithm-evolution","tag-c-2","tag-cpp","tag-programming"],"_links":{"self":[{"href":"https:\/\/cppdepend.com\/blog\/wp-json\/wp\/v2\/posts\/543","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cppdepend.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cppdepend.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cppdepend.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cppdepend.com\/blog\/wp-json\/wp\/v2\/comments?post=543"}],"version-history":[{"count":37,"href":"https:\/\/cppdepend.com\/blog\/wp-json\/wp\/v2\/posts\/543\/revisions"}],"predecessor-version":[{"id":1491,"href":"https:\/\/cppdepend.com\/blog\/wp-json\/wp\/v2\/posts\/543\/revisions\/1491"}],"wp:attachment":[{"href":"https:\/\/cppdepend.com\/blog\/wp-json\/wp\/v2\/media?parent=543"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cppdepend.com\/blog\/wp-json\/wp\/v2\/categories?post=543"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cppdepend.com\/blog\/wp-json\/wp\/v2\/tags?post=543"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}