Shipping heavy objects in std::shared_ptr

This commit is contained in:
Sergey Naumov
2016-04-24 10:33:19 +03:00
parent 2962a3cc7a
commit 19f9acb482
3 changed files with 33 additions and 33 deletions

View File

@@ -30,17 +30,17 @@ void dump_tree_container(const i3ipc::container_t& c, std::string& prefix) {
int main() { int main() {
i3ipc::connection conn; i3ipc::connection conn;
for (auto& w : conn.get_workspaces()) { for (auto& w : conn.get_workspaces()) {
std::cout << '#' << std::hex << w.num << std::dec std::cout << '#' << std::hex << w->num << std::dec
<< "\n\tName: " << w.name << "\n\tName: " << w->name
<< "\n\tVisible: " << w.visible << "\n\tVisible: " << w->visible
<< "\n\tFocused: " << w.focused << "\n\tFocused: " << w->focused
<< "\n\tUrgent: " << w.urgent << "\n\tUrgent: " << w->urgent
<< "\n\tRect: " << "\n\tRect: "
<< "\n\t\tX: " << w.rect.x << "\n\t\tX: " << w->rect.x
<< "\n\t\tY: " << w.rect.y << "\n\t\tY: " << w->rect.y
<< "\n\t\tWidth: " << w.rect.width << "\n\t\tWidth: " << w->rect.width
<< "\n\t\tHeight: " << w.rect.height << "\n\t\tHeight: " << w->rect.height
<< "\n\tOutput: " << w.output << "\n\tOutput: " << w->output
<< std::endl; << std::endl;
} }
std::string prefix_buf; std::string prefix_buf;

View File

@@ -182,13 +182,13 @@ public:
* Request a list of workspaces * Request a list of workspaces
* @return List of workspaces * @return List of workspaces
*/ */
std::vector<workspace_t> get_workspaces() const; std::vector< std::shared_ptr<workspace_t> > get_workspaces() const;
/** /**
* Request a list of outputs * Request a list of outputs
* @return List of outputs * @return List of outputs
*/ */
std::vector<output_t> get_outputs() const; std::vector< std::shared_ptr<output_t> > get_outputs() const;
/** /**
* Request a version of i3 * Request a version of i3

View File

@@ -113,7 +113,7 @@ static std::shared_ptr<container_t> parse_container_from_json(const Json::Value
#undef i3IPC_TYPE_STR #undef i3IPC_TYPE_STR
} }
static workspace_t parse_workspace_from_json(const Json::Value& value) { static std::shared_ptr<workspace_t> parse_workspace_from_json(const Json::Value& value) {
Json::Value num = value["num"]; Json::Value num = value["num"];
Json::Value name = value["name"]; Json::Value name = value["name"];
Json::Value visible = value["visible"]; Json::Value visible = value["visible"];
@@ -122,29 +122,29 @@ static workspace_t parse_workspace_from_json(const Json::Value& value) {
Json::Value rect = value["rect"]; Json::Value rect = value["rect"];
Json::Value output = value["output"]; Json::Value output = value["output"];
return { std::shared_ptr<workspace_t> p;
.num = num.asInt(), p->num = num.asInt();
.name = name.asString(), p->name = name.asString();
.visible = visible.asBool(), p->visible = visible.asBool();
.focused = focused.asBool(), p->focused = focused.asBool();
.urgent = urgent.asBool(), p->urgent = urgent.asBool();
.rect = parse_rect_from_json(rect), p->rect = parse_rect_from_json(rect);
.output = output.asString(), p->output = output.asString();
}; return p;
} }
static output_t parse_output_from_json(const Json::Value& value) { static std::shared_ptr<output_t> parse_output_from_json(const Json::Value& value) {
Json::Value name = value["name"]; Json::Value name = value["name"];
Json::Value active = value["active"]; Json::Value active = value["active"];
Json::Value current_workspace = value["current_workspace"]; Json::Value current_workspace = value["current_workspace"];
Json::Value rect = value["rect"]; Json::Value rect = value["rect"];
return { std::shared_ptr<output_t> p;
.name = name.asString(), p->name = name.asString();
.active = active.asBool(), p->active = active.asBool();
.current_workspace = (current_workspace.isNull() ? std::string() : current_workspace.asString()), p->current_workspace = (current_workspace.isNull() ? std::string() : current_workspace.asString());
.rect = parse_rect_from_json(rect), p->rect = parse_rect_from_json(rect);
}; return p;
} }
@@ -332,14 +332,14 @@ std::shared_ptr<container_t> connection::get_tree() const {
} }
std::vector<output_t> connection::get_outputs() const { std::vector< std::shared_ptr<output_t> > connection::get_outputs() const {
#define i3IPC_TYPE_STR "GET_OUTPUTS" #define i3IPC_TYPE_STR "GET_OUTPUTS"
auto buf = i3_msg(m_main_socket, ClientMessageType::GET_OUTPUTS); auto buf = i3_msg(m_main_socket, ClientMessageType::GET_OUTPUTS);
Json::Value root; Json::Value root;
IPC_JSON_READ(root) IPC_JSON_READ(root)
IPC_JSON_ASSERT_TYPE_ARRAY(root, "root") IPC_JSON_ASSERT_TYPE_ARRAY(root, "root")
std::vector<output_t> outputs; std::vector< std::shared_ptr<output_t> > outputs;
for (auto w : root) { for (auto w : root) {
outputs.push_back(parse_output_from_json(w)); outputs.push_back(parse_output_from_json(w));
@@ -350,14 +350,14 @@ std::vector<output_t> connection::get_outputs() const {
} }
std::vector<workspace_t> connection::get_workspaces() const { std::vector< std::shared_ptr<workspace_t> > connection::get_workspaces() const {
#define i3IPC_TYPE_STR "GET_WORKSPACES" #define i3IPC_TYPE_STR "GET_WORKSPACES"
auto buf = i3_msg(m_main_socket, ClientMessageType::GET_WORKSPACES); auto buf = i3_msg(m_main_socket, ClientMessageType::GET_WORKSPACES);
Json::Value root; Json::Value root;
IPC_JSON_READ(root) IPC_JSON_READ(root)
IPC_JSON_ASSERT_TYPE_ARRAY(root, "root") IPC_JSON_ASSERT_TYPE_ARRAY(root, "root")
std::vector<workspace_t> workspaces; std::vector< std::shared_ptr<workspace_t> > workspaces;
for (auto w : root) { for (auto w : root) {
workspaces.push_back(parse_workspace_from_json(w)); workspaces.push_back(parse_workspace_from_json(w));