Merge branch 'master' of feistymeow.org:feisty_meow
[feisty_meow.git] / octopi / library / sockets / base_address.h
1 #ifndef BASE_ADDRESS_CLASS
2 #define BASE_ADDRESS_CLASS
3
4 /*****************************************************************************\
5 *                                                                             *
6 *  Name   : base_address                                                      *
7 *  Author : Chris Koeritz                                                     *
8 *                                                                             *
9 *  Purpose:                                                                   *
10 *                                                                             *
11 *    Provides a way to describe an endpoint for communication.                *
12 *                                                                             *
13 *******************************************************************************
14 * Copyright (c) 1995-$now By Author.  This program is free software; you can  *
15 * redistribute it and/or modify it under the terms of the GNU General Public  *
16 * License as published by the Free Software Foundation; either version 2 of   *
17 * the License or (at your option) any later version.  This is online at:      *
18 *     http://www.fsf.org/copyleft/gpl.html                                    *
19 * Please send any updates to: fred@gruntose.com                               *
20 \*****************************************************************************/
21
22 #include <basis/astring.h>
23 #include <basis/byte_array.h>
24 #include <basis/contracts.h>
25
26 namespace sockets {
27
28 // forward.
29 class machine_uid;
30
31 class base_address
32 : public virtual basis::packable,
33   public virtual basis::nameable
34 {
35 public:
36   // the packable and nameable responsibilities are forwarded to the derived classes.
37
38   virtual bool same_host(const base_address &to_compare) const = 0;
39   virtual bool same_port(const base_address &to_compare) const = 0;
40     // returns true if the host or port are identical.
41
42   virtual bool shareable(const base_address &to_compare) const = 0;
43     // returns true if the two transports can be shared.
44
45   virtual basis::astring text_form() const = 0;
46     // returns a readable string representing the address.
47
48   // these flip the address into a string and back.  this is different from
49   // text_form() because the reversal must be possible.
50   virtual basis::astring tokenize() const = 0;
51   virtual bool detokenize(const basis::astring &info) = 0;
52
53   virtual machine_uid convert() const = 0;
54     // returns the address in the uniquifying format.
55
56   virtual base_address *create_copy() const = 0;
57     // creates a new address that's a copy of this one.  note that this
58     // allocates memory that must be deleted by the caller.
59 };
60
61 //////////////
62
63 // these macros assist in tokenizing and detokenizing addresses.
64
65 //const char *TOKEN_SEPARATOR();
66 //const char *TOKEN_ASSIGN();
67 //const char *TOKEN_SEPARATOR() { return ","; }
68 //const char *TOKEN_ASSIGN() { return "="; }
69
70 // begins operation of a variable_tokenizer for loading.  LOADER_EXIT must be called
71 // after finishing with the variable_tokenizer.
72 #define LOADER_ENTRY \
73   variable_tokenizer addr_parser; \
74   addr_parser.parse(info)
75
76 #define LOADER_EXIT 
77   // currently no implementation.
78
79 // locates a variable in the variable_tokenizer.
80 #define FIND(name, value) astring value = addr_parser.find(name)
81
82 // locates a variable like FIND, but returns if it couldn't find it.
83 #define GRAB(name, value) FIND(name, value); if (!value) return false
84
85 // begins operation of a variable_tokenizer for storing.  remember to call STORER_EXIT
86 // when finished.
87 #define STORER_ENTRY \
88   variable_tokenizer addr_parser
89
90 #define STORER_EXIT 
91   // currently no implementation.
92
93 // adds a new entry into the variable_tokenizer.
94 #define ADD(name, value) addr_parser.table().add(name, value)
95
96 // returns the accumulated tokens in the storing variable_tokenizer.
97 #define DUMP_EXIT astring to_return = addr_parser.text_form(); \
98   STORER_EXIT; \
99   return to_return
100
101 } //namespace.
102
103 #endif
104