WIP: c++
diff --git a/examples/MODULE.bazel b/examples/MODULE.bazel index 5984bdd..221af6c 100644 --- a/examples/MODULE.bazel +++ b/examples/MODULE.bazel
@@ -24,8 +24,8 @@ protoc = use_extension("@toolchains_protoc//protoc:extensions.bzl", "protoc") protoc.toolchain( google_protobuf = "com_google_protobuf", - # Demonstrate overriding the default version - version = "v28.0", + # NB: c++ codegen requires this version to exactly match the protobuf bazel_dep + version = "v29.3", ) use_repo(protoc, "com_google_protobuf", "toolchains_protoc_hub")
diff --git a/examples/cc/BUILD.bazel b/examples/cc/BUILD.bazel new file mode 100644 index 0000000..1d2bee9 --- /dev/null +++ b/examples/cc/BUILD.bazel
@@ -0,0 +1,7 @@ +load("@rules_cc//cc:defs.bzl", "cc_binary") + +cc_binary( + name = "cc", + srcs = ["greeter_example.cc"], + deps = ["//proto:greeter_cc_proto"], +)
diff --git a/examples/cc/greeter_example.cc b/examples/cc/greeter_example.cc new file mode 100644 index 0000000..273934e --- /dev/null +++ b/examples/cc/greeter_example.cc
@@ -0,0 +1,93 @@ +#include <iostream> +#include <fstream> +#include <string> +#include "greeter.pb.h" +using namespace std; + +// This function fills in a Person message based on user input. +void PromptForAddress(tutorial::Person* person) { + cout << "Enter person ID number: "; + int id; + cin >> id; + person->set_id(id); + cin.ignore(256, '\n'); + + cout << "Enter name: "; + getline(cin, *person->mutable_name()); + + cout << "Enter email address (blank for none): "; + string email; + getline(cin, email); + if (!email.empty()) { + person->set_email(email); + } + + while (true) { + cout << "Enter a phone number (or leave blank to finish): "; + string number; + getline(cin, number); + if (number.empty()) { + break; + } + + tutorial::Person::PhoneNumber* phone_number = person->add_phones(); + phone_number->set_number(number); + + cout << "Is this a mobile, home, or work phone? "; + string type; + getline(cin, type); + if (type == "mobile") { + phone_number->set_type(tutorial::Person::PHONE_TYPE_MOBILE); + } else if (type == "home") { + phone_number->set_type(tutorial::Person::PHONE_TYPE_HOME); + } else if (type == "work") { + phone_number->set_type(tutorial::Person::PHONE_TYPE_WORK); + } else { + cout << "Unknown phone type. Using default." << endl; + } + } +} + +// Main function: Reads the entire address book from a file, +// adds one person based on user input, then writes it back out to the same +// file. +int main(int argc, char* argv[]) { + // Verify that the version of the library that we linked against is + // compatible with the version of the headers we compiled against. + GOOGLE_PROTOBUF_VERIFY_VERSION; + + if (argc != 2) { + cerr << "Usage: " << argv[0] << " ADDRESS_BOOK_FILE" << endl; + return -1; + } + + tutorial::AddressBook address_book; + + { + // Read the existing address book. + fstream input(argv[1], ios::in | ios::binary); + if (!input) { + cout << argv[1] << ": File not found. Creating a new file." << endl; + } else if (!address_book.ParseFromIstream(&input)) { + cerr << "Failed to parse address book." << endl; + return -1; + } + } + + // Add an address. + PromptForAddress(address_book.add_people()); + + { + // Write the new address book back to disk. + fstream output(argv[1], ios::out | ios::trunc | ios::binary); + if (!address_book.SerializeToOstream(&output)) { + cerr << "Failed to write address book." << endl; + return -1; + } + } + + // Optional: Delete all global objects allocated by libprotobuf. + google::protobuf::ShutdownProtobufLibrary(); + + return 0; +}
diff --git a/examples/proto/BUILD.bazel b/examples/proto/BUILD.bazel index 88c206c..a5a520c 100644 --- a/examples/proto/BUILD.bazel +++ b/examples/proto/BUILD.bazel
@@ -2,6 +2,7 @@ load("@rules_go//proto:def.bzl", "go_proto_library") load("@rules_proto//proto:defs.bzl", "proto_library") load("@rules_rust_prost//:defs.bzl", "rust_prost_library") +load("@protobuf//bazel:cc_proto_library.bzl", "cc_proto_library") load("@protobuf//bazel:py_proto_library.bzl", "py_proto_library") package(default_visibility = ["//visibility:public"]) @@ -12,6 +13,11 @@ deps = ["@com_google_protobuf//:any_proto"], ) +cc_proto_library( + name = "greeter_cc_proto", + deps = [":greeter_proto"], +) + py_proto_library( name = "greeter_py_proto", deps = [":greeter_proto"],