LOAD '_OBJWD_/varbit.so';

CREATE FUNCTION varbitin(opaque)
   RETURNS bit
   AS '_OBJWD_/varbit.so'
   LANGUAGE 'c';

CREATE FUNCTION zpbitout(opaque)
   RETURNS opaque
   AS '_OBJWD_/varbit.so'
   LANGUAGE 'c';

CREATE TYPE bit (
   internallength = -1,
   input = varbitin,
   output = zpbitout
);

CREATE FUNCTION bitcat(bit,bit) RETURNS bit
  AS '_OBJWD_/varbit.so'
  LANGUAGE 'C';

CREATE OPERATOR || (
  leftarg = bit,
  rightarg = bit,
  procedure = bitcat
);

CREATE FUNCTION bitsubstr(bit,integer,integer) RETURNS bit
  AS '_OBJWD_/varbit.so'
  LANGUAGE 'C';

CREATE FUNCTION biteq(bit,bit) RETURNS bool
  AS '_OBJWD_/varbit.so'
  LANGUAGE 'C';

CREATE OPERATOR = (
  leftarg = bit,
  rightarg = bit,
  procedure = biteq,
  negator = <>,
  commutator = =
); 

CREATE FUNCTION bitne(bit,bit) RETURNS bool
  AS '_OBJWD_/varbit.so'
  LANGUAGE 'C';

CREATE OPERATOR <> (
  leftarg = bit,
  rightarg = bit,
  procedure = bitne,
  negator = =,
  commutator = <>
); 

CREATE FUNCTION bitlt(bit,bit) RETURNS bool
  AS '_OBJWD_/varbit.so'
  LANGUAGE 'C';

CREATE OPERATOR < (
  leftarg = bit,
  rightarg = bit,
  procedure = bitlt
); 

CREATE FUNCTION bitle(bit,bit) RETURNS bool
  AS '_OBJWD_/varbit.so'
  LANGUAGE 'C';

CREATE OPERATOR <= (
  leftarg = bit,
  rightarg = bit,
  procedure = bitle
); 

CREATE FUNCTION bitgt(bit,bit) RETURNS bool
  AS '_OBJWD_/varbit.so'
  LANGUAGE 'C';

CREATE OPERATOR > (
  leftarg = bit,
  rightarg = bit,
  procedure = bitgt,
  negator = <=,
  commutator = <
); 

CREATE FUNCTION bitge(bit,bit) RETURNS bool
  as '_OBJWD_/varbit.so'
  language 'C';

CREATE OPERATOR >= (
  leftarg = bit,
  rightarg = bit,
  procedure = bitge,
  negator = <,
  commutator = <=
); 

CREATE FUNCTION bitcmp(bit,bit) RETURNS integer
  AS '_OBJWD_/varbit.so'
  LANGUAGE 'C';

CREATE OPERATOR <=> (
  leftarg = bit,
  rightarg = bit,
  procedure = bitcmp
); 

CREATE FUNCTION bitor(bit,bit) RETURNS bit
  AS '_OBJWD_/varbit.so'
  LANGUAGE 'C';

CREATE OPERATOR | (
  leftarg = bit,
  rightarg = bit,
  procedure = bitor,
  commutator = |
); 

CREATE FUNCTION bitand(bit,bit) RETURNS bit
  AS '_OBJWD_/varbit.so'
  LANGUAGE 'C';

CREATE OPERATOR & (
  leftarg = bit,
  rightarg = bit,
  procedure = bitand,
  commutator = &
); 


CREATE FUNCTION bitxor(bit,bit) RETURNS bit
  AS '_OBJWD_/varbit.so'
  LANGUAGE 'C';

CREATE OPERATOR ^ (
  leftarg = bit,
  rightarg = bit,
  procedure = bitxor
); 

CREATE FUNCTION bitnot(bit) RETURNS bit
  AS '_OBJWD_/varbit.so'
  LANGUAGE 'C';

CREATE OPERATOR ~ (
  rightarg = bit,
  procedure = bitnot
); 

CREATE FUNCTION bitshiftleft(bit,integer) RETURNS bit
  AS '_OBJWD_/varbit.so'
  LANGUAGE 'C';

CREATE OPERATOR << (
  leftarg = bit,
  rightarg = integer,
  procedure = bitshiftleft
);

CREATE FUNCTION bitshiftright(bit,integer) RETURNS bit
  AS '_OBJWD_/varbit.so'
  LANGUAGE 'C';

CREATE OPERATOR >> (
  leftarg = bit,
  rightarg = integer,
  procedure = bitshiftright
);